mongoid 3.1.7 → 4.0.0.alpha1

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 (521) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +317 -11
  3. data/README.md +4 -5
  4. data/lib/config/locales/en.yml +9 -12
  5. data/lib/mongoid.rb +6 -75
  6. data/lib/mongoid/atomic.rb +0 -11
  7. data/lib/mongoid/atomic/paths/embedded.rb +0 -30
  8. data/lib/mongoid/atomic/paths/root.rb +0 -13
  9. data/lib/mongoid/attributes.rb +30 -108
  10. data/lib/mongoid/attributes/dynamic.rb +154 -0
  11. data/lib/mongoid/attributes/nested.rb +82 -0
  12. data/lib/mongoid/attributes/processing.rb +13 -66
  13. data/lib/mongoid/{dirty.rb → changeable.rb} +5 -2
  14. data/lib/mongoid/composable.rb +104 -0
  15. data/lib/mongoid/config.rb +3 -9
  16. data/lib/mongoid/config/options.rb +1 -1
  17. data/lib/mongoid/contextual/aggregable/mongo.rb +5 -9
  18. data/lib/mongoid/contextual/atomic.rb +53 -53
  19. data/lib/mongoid/contextual/command.rb +26 -0
  20. data/lib/mongoid/contextual/map_reduce.rb +1 -1
  21. data/lib/mongoid/contextual/memory.rb +6 -5
  22. data/lib/mongoid/contextual/mongo.rb +59 -28
  23. data/lib/mongoid/contextual/text_search.rb +180 -0
  24. data/lib/mongoid/copyable.rb +2 -3
  25. data/lib/mongoid/criteria.rb +13 -33
  26. data/lib/mongoid/criteria/{#findable.rb# → findable.rb} +0 -2
  27. data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
  28. data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
  29. data/lib/mongoid/{criterion → criteria}/modifiable.rb +1 -1
  30. data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
  31. data/lib/mongoid/document.rb +28 -12
  32. data/lib/mongoid/errors.rb +1 -1
  33. data/lib/mongoid/errors/document_not_found.rb +2 -1
  34. data/lib/mongoid/errors/invalid_value.rb +16 -0
  35. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  36. data/lib/mongoid/extensions.rb +2 -7
  37. data/lib/mongoid/extensions/array.rb +2 -2
  38. data/lib/mongoid/extensions/boolean.rb +14 -17
  39. data/lib/mongoid/extensions/float.rb +1 -0
  40. data/lib/mongoid/extensions/hash.rb +1 -1
  41. data/lib/mongoid/extensions/object.rb +4 -4
  42. data/lib/mongoid/extensions/object_id.rb +5 -5
  43. data/lib/mongoid/extensions/range.rb +8 -2
  44. data/lib/mongoid/extensions/string.rb +5 -17
  45. data/lib/mongoid/extensions/time.rb +2 -2
  46. data/lib/mongoid/factory.rb +3 -3
  47. data/lib/mongoid/fields.rb +9 -8
  48. data/lib/mongoid/fields/foreign_key.rb +3 -3
  49. data/lib/mongoid/fields/standard.rb +4 -16
  50. data/lib/mongoid/fields/validators/macro.rb +11 -3
  51. data/lib/mongoid/{finders.rb → findable.rb} +6 -2
  52. data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
  53. data/lib/mongoid/indexable/specification.rb +104 -0
  54. data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
  55. data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
  56. data/lib/mongoid/{callbacks.rb → interceptable.rb} +3 -52
  57. data/lib/mongoid/log_subscriber.rb +22 -0
  58. data/lib/mongoid/matchable.rb +152 -0
  59. data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
  60. data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
  61. data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
  62. data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
  63. data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
  64. data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
  65. data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
  66. data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
  67. data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
  68. data/lib/mongoid/{matchers → matchable}/ne.rb +1 -1
  69. data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
  70. data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
  71. data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
  72. data/lib/mongoid/persistable.rb +212 -0
  73. data/lib/mongoid/persistable/creatable.rb +188 -0
  74. data/lib/mongoid/persistable/deletable.rb +148 -0
  75. data/lib/mongoid/persistable/destroyable.rb +55 -0
  76. data/lib/mongoid/persistable/incrementable.rb +36 -0
  77. data/lib/mongoid/persistable/logical.rb +38 -0
  78. data/lib/mongoid/persistable/poppable.rb +39 -0
  79. data/lib/mongoid/persistable/pullable.rb +55 -0
  80. data/lib/mongoid/persistable/pushable.rb +62 -0
  81. data/lib/mongoid/persistable/renamable.rb +35 -0
  82. data/lib/mongoid/persistable/savable.rb +52 -0
  83. data/lib/mongoid/persistable/settable.rb +33 -0
  84. data/lib/mongoid/persistable/unsettable.rb +36 -0
  85. data/lib/mongoid/persistable/updatable.rb +151 -0
  86. data/lib/mongoid/persistable/upsertable.rb +55 -0
  87. data/lib/mongoid/positional.rb +71 -0
  88. data/lib/mongoid/railtie.rb +32 -45
  89. data/lib/mongoid/railties/database.rake +12 -6
  90. data/lib/mongoid/relations.rb +3 -3
  91. data/lib/mongoid/relations/accessors.rb +13 -46
  92. data/lib/mongoid/relations/auto_save.rb +15 -36
  93. data/lib/mongoid/relations/binding.rb +0 -23
  94. data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
  95. data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
  96. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +3 -1
  97. data/lib/mongoid/relations/builder.rb +1 -1
  98. data/lib/mongoid/relations/builders.rb +2 -2
  99. data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
  100. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -5
  101. data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
  102. data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
  103. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
  104. data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
  105. data/lib/mongoid/relations/cascading.rb +3 -5
  106. data/lib/mongoid/relations/constraint.rb +1 -1
  107. data/lib/mongoid/relations/conversions.rb +1 -1
  108. data/lib/mongoid/relations/counter_cache.rb +39 -15
  109. data/lib/mongoid/relations/eager.rb +47 -0
  110. data/lib/mongoid/relations/eager/base.rb +57 -0
  111. data/lib/mongoid/relations/eager/belongs_to.rb +30 -0
  112. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +40 -0
  113. data/lib/mongoid/relations/eager/has_many.rb +37 -0
  114. data/lib/mongoid/relations/eager/has_one.rb +29 -0
  115. data/lib/mongoid/relations/embedded/batchable.rb +3 -4
  116. data/lib/mongoid/relations/embedded/many.rb +7 -27
  117. data/lib/mongoid/relations/macros.rb +2 -4
  118. data/lib/mongoid/relations/many.rb +30 -31
  119. data/lib/mongoid/relations/metadata.rb +6 -75
  120. data/lib/mongoid/relations/nested_builder.rb +2 -2
  121. data/lib/mongoid/relations/options.rb +1 -0
  122. data/lib/mongoid/relations/polymorphic.rb +0 -1
  123. data/lib/mongoid/relations/proxy.rb +10 -32
  124. data/lib/mongoid/relations/referenced/in.rb +2 -18
  125. data/lib/mongoid/relations/referenced/many.rb +9 -22
  126. data/lib/mongoid/relations/referenced/many_to_many.rb +10 -33
  127. data/lib/mongoid/relations/referenced/one.rb +2 -21
  128. data/lib/mongoid/relations/synchronization.rb +3 -3
  129. data/lib/mongoid/relations/touchable.rb +33 -0
  130. data/lib/mongoid/{reloading.rb → reloadable.rb} +6 -4
  131. data/lib/mongoid/{scoping.rb → scopable.rb} +26 -3
  132. data/lib/mongoid/selectable.rb +59 -0
  133. data/lib/mongoid/{serialization.rb → serializable.rb} +10 -1
  134. data/lib/mongoid/sessions.rb +37 -345
  135. data/lib/mongoid/sessions/factory.rb +2 -0
  136. data/lib/mongoid/sessions/options.rb +176 -0
  137. data/lib/mongoid/sessions/storage_options.rb +140 -0
  138. data/lib/mongoid/sessions/thread_options.rb +19 -0
  139. data/lib/mongoid/sessions/validators/storage.rb +15 -1
  140. data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
  141. data/lib/mongoid/support/query_counter.rb +23 -0
  142. data/lib/mongoid/threaded.rb +0 -110
  143. data/lib/mongoid/threaded/lifecycle.rb +0 -28
  144. data/lib/mongoid/timestamps/updated/short.rb +2 -2
  145. data/lib/mongoid/{hierarchy.rb → traversable.rb} +9 -5
  146. data/lib/mongoid/{validations.rb → validatable.rb} +23 -9
  147. data/lib/mongoid/{validations → validatable}/associated.rb +3 -1
  148. data/lib/mongoid/{validations → validatable}/format.rb +1 -1
  149. data/lib/mongoid/{validations → validatable}/length.rb +1 -1
  150. data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
  151. data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
  152. data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
  153. data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
  154. data/lib/mongoid/{validations → validatable}/uniqueness.rb +3 -3
  155. data/lib/mongoid/version.rb +1 -1
  156. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +9 -13
  157. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  158. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
  159. data/lib/rails/generators/mongoid_generator.rb +3 -40
  160. data/lib/rails/mongoid.rb +59 -57
  161. data/lib/support/ruby_version.rb +1 -1
  162. data/spec/app/models/account.rb +2 -6
  163. data/spec/app/models/acolyte.rb +1 -0
  164. data/spec/app/models/actor.rb +0 -1
  165. data/spec/app/models/address.rb +6 -1
  166. data/spec/app/models/animal.rb +1 -1
  167. data/spec/app/models/appointment.rb +2 -2
  168. data/spec/app/models/article.rb +1 -4
  169. data/spec/app/models/audio.rb +5 -0
  170. data/spec/app/models/author.rb +0 -2
  171. data/spec/app/models/band.rb +3 -2
  172. data/spec/app/models/bar.rb +1 -0
  173. data/spec/app/models/book.rb +1 -0
  174. data/spec/app/models/building.rb +0 -2
  175. data/spec/app/models/building_address.rb +0 -2
  176. data/spec/app/models/bus.rb +1 -1
  177. data/spec/app/models/canvas.rb +1 -1
  178. data/spec/app/models/contractor.rb +0 -2
  179. data/spec/app/models/country_code.rb +1 -1
  180. data/spec/app/models/definition.rb +2 -2
  181. data/spec/app/models/dragon.rb +4 -0
  182. data/spec/app/models/drug.rb +1 -3
  183. data/spec/app/models/dungeon.rb +4 -0
  184. data/spec/app/models/filesystem.rb +1 -0
  185. data/spec/app/models/fish.rb +0 -1
  186. data/spec/app/models/fruits.rb +6 -0
  187. data/spec/app/models/game.rb +0 -2
  188. data/spec/app/models/house.rb +0 -2
  189. data/spec/app/models/item.rb +1 -5
  190. data/spec/app/models/jar.rb +1 -1
  191. data/spec/app/models/label.rb +4 -4
  192. data/spec/app/models/login.rb +1 -1
  193. data/spec/app/models/movie.rb +1 -0
  194. data/spec/app/models/name.rb +3 -3
  195. data/spec/app/models/note.rb +1 -1
  196. data/spec/app/models/oscar.rb +1 -1
  197. data/spec/app/models/parent_doc.rb +1 -1
  198. data/spec/app/models/person.rb +13 -8
  199. data/spec/app/models/phone.rb +1 -3
  200. data/spec/app/models/player.rb +1 -1
  201. data/spec/app/models/post.rb +2 -1
  202. data/spec/app/models/quiz.rb +0 -3
  203. data/spec/app/models/record.rb +5 -5
  204. data/spec/app/models/registry.rb +1 -1
  205. data/spec/app/models/server.rb +1 -1
  206. data/spec/app/models/service.rb +3 -3
  207. data/spec/app/models/sound.rb +5 -0
  208. data/spec/app/models/template.rb +1 -1
  209. data/spec/app/models/title.rb +0 -1
  210. data/spec/app/models/track.rb +5 -5
  211. data/spec/app/models/tree.rb +1 -1
  212. data/spec/app/models/video.rb +0 -4
  213. data/spec/app/models/wiki_page.rb +1 -4
  214. data/spec/app/models/word.rb +3 -0
  215. data/spec/app/models/word_origin.rb +1 -1
  216. data/spec/config/mongoid.yml +7 -8
  217. data/spec/helpers.rb +18 -0
  218. data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
  219. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
  220. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
  221. data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
  222. data/spec/mongoid/atomic/paths_spec.rb +19 -19
  223. data/spec/mongoid/atomic_spec.rb +19 -19
  224. data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +335 -448
  225. data/spec/mongoid/attributes/readonly_spec.rb +16 -16
  226. data/spec/mongoid/attributes_spec.rb +188 -434
  227. data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +117 -148
  228. data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
  229. data/spec/mongoid/config/environment_spec.rb +3 -3
  230. data/spec/mongoid/config/options_spec.rb +6 -6
  231. data/spec/mongoid/config_spec.rb +24 -48
  232. data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
  233. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +46 -38
  234. data/spec/mongoid/contextual/atomic_spec.rb +60 -56
  235. data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
  236. data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
  237. data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
  238. data/spec/mongoid/contextual/memory_spec.rb +94 -94
  239. data/spec/mongoid/contextual/mongo_spec.rb +225 -139
  240. data/spec/mongoid/contextual/text_search_spec.rb +207 -0
  241. data/spec/mongoid/copyable_spec.rb +56 -68
  242. data/spec/mongoid/criteria/findable_spec.rb +991 -0
  243. data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
  244. data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
  245. data/spec/mongoid/criteria/modifiable_spec.rb +1063 -0
  246. data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +31 -31
  247. data/spec/mongoid/criteria_spec.rb +530 -2207
  248. data/spec/mongoid/document_spec.rb +166 -120
  249. data/spec/mongoid/equality_spec.rb +22 -22
  250. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
  251. data/spec/mongoid/errors/callback_spec.rb +3 -3
  252. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
  253. data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
  254. data/spec/mongoid/errors/eager_load_spec.rb +3 -3
  255. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
  256. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
  257. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
  258. data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
  259. data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
  260. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
  261. data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
  262. data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
  263. data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
  264. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -3
  265. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
  266. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
  267. data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
  268. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
  269. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
  270. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
  271. data/spec/mongoid/errors/mongoid_error_spec.rb +7 -7
  272. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
  273. data/spec/mongoid/errors/no_environment_spec.rb +3 -3
  274. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
  275. data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
  276. data/spec/mongoid/errors/no_parent_spec.rb +3 -3
  277. data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
  278. data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
  279. data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
  280. data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
  281. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
  282. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
  283. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
  284. data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
  285. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
  286. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
  287. data/spec/mongoid/errors/validations_spec.rb +7 -7
  288. data/spec/mongoid/extensions/array_spec.rb +61 -61
  289. data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
  290. data/spec/mongoid/extensions/binary_spec.rb +12 -12
  291. data/spec/mongoid/extensions/boolean_spec.rb +18 -18
  292. data/spec/mongoid/extensions/date_spec.rb +13 -13
  293. data/spec/mongoid/extensions/date_time_spec.rb +9 -9
  294. data/spec/mongoid/extensions/false_class_spec.rb +5 -5
  295. data/spec/mongoid/extensions/float_spec.rb +29 -15
  296. data/spec/mongoid/extensions/hash_spec.rb +29 -29
  297. data/spec/mongoid/extensions/integer_spec.rb +15 -15
  298. data/spec/mongoid/extensions/module_spec.rb +2 -2
  299. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  300. data/spec/mongoid/extensions/object_id_spec.rb +134 -134
  301. data/spec/mongoid/extensions/object_spec.rb +26 -26
  302. data/spec/mongoid/extensions/range_spec.rb +61 -12
  303. data/spec/mongoid/extensions/regexp_spec.rb +4 -4
  304. data/spec/mongoid/extensions/set_spec.rb +4 -4
  305. data/spec/mongoid/extensions/string_spec.rb +35 -46
  306. data/spec/mongoid/extensions/symbol_spec.rb +9 -9
  307. data/spec/mongoid/extensions/time_spec.rb +49 -49
  308. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
  309. data/spec/mongoid/extensions/true_class_spec.rb +5 -5
  310. data/spec/mongoid/extensions_spec.rb +15 -0
  311. data/spec/mongoid/factory_spec.rb +15 -15
  312. data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
  313. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
  314. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
  315. data/spec/mongoid/fields/localized_spec.rb +23 -23
  316. data/spec/mongoid/fields/standard_spec.rb +12 -12
  317. data/spec/mongoid/fields_spec.rb +168 -209
  318. data/spec/mongoid/{finders_spec.rb → findable_spec.rb} +62 -27
  319. data/spec/mongoid/indexable/specification_spec.rb +102 -0
  320. data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
  321. data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
  322. data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +105 -105
  323. data/spec/mongoid/log_subscriber_spec.rb +74 -0
  324. data/spec/mongoid/loggable_spec.rb +1 -1
  325. data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
  326. data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
  327. data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
  328. data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
  329. data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
  330. data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
  331. data/spec/mongoid/matchable/in_spec.rb +49 -0
  332. data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
  333. data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
  334. data/spec/mongoid/{matchers → matchable}/ne_spec.rb +3 -3
  335. data/spec/mongoid/matchable/nin_spec.rb +48 -0
  336. data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
  337. data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
  338. data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
  339. data/spec/mongoid/persistable/creatable_spec.rb +512 -0
  340. data/spec/mongoid/persistable/deletable_spec.rb +205 -0
  341. data/spec/mongoid/persistable/destroyable_spec.rb +148 -0
  342. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  343. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  344. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  345. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  346. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  347. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  348. data/spec/mongoid/persistable/savable_spec.rb +432 -0
  349. data/spec/mongoid/persistable/settable_spec.rb +139 -0
  350. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  351. data/spec/mongoid/persistable/updatable_spec.rb +558 -0
  352. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  353. data/spec/mongoid/persistable_spec.rb +206 -0
  354. data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +19 -14
  355. data/spec/mongoid/railties/document_spec.rb +2 -2
  356. data/spec/mongoid/relations/accessors_spec.rb +53 -145
  357. data/spec/mongoid/relations/auto_save_spec.rb +36 -16
  358. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +6 -6
  359. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +2 -2
  360. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +3 -3
  361. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +12 -12
  362. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +6 -6
  363. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +9 -9
  364. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +6 -6
  365. data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
  366. data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
  367. data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
  368. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
  369. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
  370. data/spec/mongoid/relations/builders/referenced/in_spec.rb +22 -33
  371. data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
  372. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
  373. data/spec/mongoid/relations/builders/referenced/one_spec.rb +11 -24
  374. data/spec/mongoid/relations/builders_spec.rb +21 -21
  375. data/spec/mongoid/relations/cascading/delete_spec.rb +7 -7
  376. data/spec/mongoid/relations/cascading/destroy_spec.rb +2 -2
  377. data/spec/mongoid/relations/cascading/nullify_spec.rb +2 -2
  378. data/spec/mongoid/relations/cascading/restrict_spec.rb +3 -3
  379. data/spec/mongoid/relations/cascading_spec.rb +16 -16
  380. data/spec/mongoid/relations/constraint_spec.rb +8 -7
  381. data/spec/mongoid/relations/conversions_spec.rb +16 -14
  382. data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
  383. data/spec/mongoid/relations/cyclic_spec.rb +18 -18
  384. data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
  385. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +143 -0
  386. data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
  387. data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
  388. data/spec/mongoid/relations/eager_spec.rb +228 -0
  389. data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
  390. data/spec/mongoid/relations/embedded/in_spec.rb +55 -56
  391. data/spec/mongoid/relations/embedded/many_spec.rb +357 -367
  392. data/spec/mongoid/relations/embedded/one_spec.rb +98 -139
  393. data/spec/mongoid/relations/macros_spec.rb +108 -102
  394. data/spec/mongoid/relations/metadata_spec.rb +147 -241
  395. data/spec/mongoid/relations/options_spec.rb +1 -1
  396. data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
  397. data/spec/mongoid/relations/proxy_spec.rb +2 -2
  398. data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
  399. data/spec/mongoid/relations/referenced/many_spec.rb +379 -522
  400. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +345 -417
  401. data/spec/mongoid/relations/referenced/one_spec.rb +148 -263
  402. data/spec/mongoid/relations/reflections_spec.rb +6 -6
  403. data/spec/mongoid/relations/synchronization_spec.rb +46 -50
  404. data/spec/mongoid/relations/targets/enumerable_spec.rb +116 -116
  405. data/spec/mongoid/relations/touchable_spec.rb +296 -0
  406. data/spec/mongoid/relations_spec.rb +16 -15
  407. data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +20 -60
  408. data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +74 -126
  409. data/spec/mongoid/selectable_spec.rb +134 -0
  410. data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +111 -82
  411. data/spec/mongoid/sessions/factory_spec.rb +49 -28
  412. data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
  413. data/spec/mongoid/sessions/options_spec.rb +92 -0
  414. data/spec/mongoid/sessions_spec.rb +288 -177
  415. data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
  416. data/spec/mongoid/state_spec.rb +10 -10
  417. data/spec/mongoid/threaded_spec.rb +17 -70
  418. data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
  419. data/spec/mongoid/timestamps/created_spec.rb +5 -5
  420. data/spec/mongoid/timestamps/updated/short_spec.rb +10 -10
  421. data/spec/mongoid/timestamps/updated_spec.rb +8 -12
  422. data/spec/mongoid/timestamps_spec.rb +7 -11
  423. data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
  424. data/spec/mongoid/{validations → validatable}/associated_spec.rb +18 -18
  425. data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
  426. data/spec/mongoid/{validations → validatable}/length_spec.rb +7 -7
  427. data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
  428. data/spec/mongoid/{validations → validatable}/presence_spec.rb +31 -38
  429. data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +126 -183
  430. data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
  431. data/spec/mongoid_spec.rb +8 -8
  432. data/spec/rails/mongoid_spec.rb +72 -87
  433. data/spec/spec_helper.rb +19 -17
  434. metadata +261 -283
  435. data/lib/mongoid/atomic/positionable.rb +0 -73
  436. data/lib/mongoid/components.rb +0 -92
  437. data/lib/mongoid/config/inflections.rb +0 -6
  438. data/lib/mongoid/contextual/eager.rb +0 -158
  439. data/lib/mongoid/criterion/findable.rb +0 -179
  440. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  441. data/lib/mongoid/identity_map.rb +0 -163
  442. data/lib/mongoid/json.rb +0 -16
  443. data/lib/mongoid/matchers.rb +0 -32
  444. data/lib/mongoid/matchers/strategies.rb +0 -97
  445. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  446. data/lib/mongoid/nested_attributes.rb +0 -78
  447. data/lib/mongoid/observer.rb +0 -192
  448. data/lib/mongoid/paranoia.rb +0 -136
  449. data/lib/mongoid/persistence.rb +0 -357
  450. data/lib/mongoid/persistence/atomic.rb +0 -231
  451. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  452. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  453. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  454. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  455. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  456. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  457. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  458. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  459. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  460. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  461. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  462. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  463. data/lib/mongoid/persistence/deletion.rb +0 -31
  464. data/lib/mongoid/persistence/insertion.rb +0 -38
  465. data/lib/mongoid/persistence/modification.rb +0 -35
  466. data/lib/mongoid/persistence/operations.rb +0 -214
  467. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  468. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  469. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  470. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  471. data/lib/mongoid/persistence/operations/update.rb +0 -59
  472. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  473. data/lib/mongoid/persistence/upsertion.rb +0 -31
  474. data/lib/mongoid/unit_of_work.rb +0 -61
  475. data/lib/mongoid/versioning.rb +0 -217
  476. data/lib/rack/mongoid.rb +0 -2
  477. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  478. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  479. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  480. data/spec/app/models/actor_observer.rb +0 -15
  481. data/spec/app/models/callback_recorder.rb +0 -25
  482. data/spec/app/models/draft.rb +0 -9
  483. data/spec/app/models/paranoid_phone.rb +0 -25
  484. data/spec/app/models/paranoid_post.rb +0 -36
  485. data/spec/app/models/phone_observer.rb +0 -6
  486. data/spec/mongoid/#atomic_spec.rb# +0 -365
  487. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  488. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  489. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  490. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  491. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  492. data/spec/mongoid/identity_map_spec.rb +0 -564
  493. data/spec/mongoid/json_spec.rb +0 -33
  494. data/spec/mongoid/matchers/in_spec.rb +0 -25
  495. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  496. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  497. data/spec/mongoid/observer_spec.rb +0 -290
  498. data/spec/mongoid/paranoia_spec.rb +0 -759
  499. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  500. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  501. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  502. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  503. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  504. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  505. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  506. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  507. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  508. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  509. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  510. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  511. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  512. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  513. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  514. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  515. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  516. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  517. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  518. data/spec/mongoid/persistence_spec.rb +0 -2279
  519. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  520. data/spec/mongoid/versioning_spec.rb +0 -540
  521. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Mongoid::Finders do
3
+ describe Mongoid::Findable do
4
4
 
5
5
  describe ".distinct" do
6
6
 
@@ -10,7 +10,7 @@ describe Mongoid::Finders do
10
10
  end
11
11
 
12
12
  it "returns the distinct values for the field" do
13
- Band.distinct(:name).should eq([ "Tool", "Photek" ])
13
+ expect(Band.distinct(:name)).to eq([ "Tool", "Photek" ])
14
14
  end
15
15
  end
16
16
 
@@ -22,7 +22,7 @@ describe Mongoid::Finders do
22
22
 
23
23
  it "iterates through all documents" do
24
24
  Band.each do |band|
25
- band.should be_a(Band)
25
+ expect(band).to be_a(Band)
26
26
  end
27
27
  end
28
28
  end
@@ -35,7 +35,7 @@ describe Mongoid::Finders do
35
35
 
36
36
  it "iterates through all documents" do
37
37
  Band.each_with_index do |band, index|
38
- index.should eq(0)
38
+ expect(index).to eq(0)
39
39
  end
40
40
  end
41
41
  end
@@ -47,7 +47,7 @@ describe Mongoid::Finders do
47
47
  end
48
48
 
49
49
  it "returns the document" do
50
- Person.find_and_modify(title: "Junior").should eq(person)
50
+ expect(Person.find_and_modify(title: "Junior")).to eq(person)
51
51
  end
52
52
  end
53
53
 
@@ -62,7 +62,7 @@ describe Mongoid::Finders do
62
62
  context "when no block is provided" do
63
63
 
64
64
  it "returns the document" do
65
- Person.find_by(title: "sir").should eq(person)
65
+ expect(Person.find_by(title: "sir")).to eq(person)
66
66
  end
67
67
  end
68
68
 
@@ -75,7 +75,7 @@ describe Mongoid::Finders do
75
75
  end
76
76
 
77
77
  it "yields the returned document" do
78
- result.age.should eq(50)
78
+ expect(result.age).to eq(50)
79
79
  end
80
80
  end
81
81
  end
@@ -108,7 +108,7 @@ describe Mongoid::Finders do
108
108
  context "when no block is provided" do
109
109
 
110
110
  it "returns nil" do
111
- Person.find_by(ssn: "333-22-1111").should be_nil
111
+ expect(Person.find_by(ssn: "333-22-1111")).to be_nil
112
112
  end
113
113
  end
114
114
 
@@ -121,13 +121,27 @@ describe Mongoid::Finders do
121
121
  end
122
122
 
123
123
  it "returns nil" do
124
- result.should be_nil
124
+ expect(result).to be_nil
125
125
  end
126
126
  end
127
127
  end
128
128
  end
129
129
  end
130
130
 
131
+ [ :first, :one ].each do |method|
132
+
133
+ describe "##{method}" do
134
+
135
+ let!(:person) do
136
+ Person.create
137
+ end
138
+
139
+ it "returns the first matching document" do
140
+ expect(Person.send(method)).to eq(person)
141
+ end
142
+ end
143
+ end
144
+
131
145
  describe ".first_or_create" do
132
146
 
133
147
  context "when the document is found" do
@@ -137,7 +151,7 @@ describe Mongoid::Finders do
137
151
  end
138
152
 
139
153
  it "returns the document" do
140
- Person.first_or_create.should eq(person)
154
+ expect(Person.first_or_create).to eq(person)
141
155
  end
142
156
  end
143
157
 
@@ -154,7 +168,7 @@ describe Mongoid::Finders do
154
168
  end
155
169
 
156
170
  it "returns the new document" do
157
- from_db.person.should eq(person)
171
+ expect(from_db.person).to eq(person)
158
172
  end
159
173
  end
160
174
 
@@ -165,11 +179,11 @@ describe Mongoid::Finders do
165
179
  end
166
180
 
167
181
  it "creates a persisted document" do
168
- person.should be_persisted
182
+ expect(person).to be_persisted
169
183
  end
170
184
 
171
185
  it "sets the attributes" do
172
- person.title.should eq("Senorita")
186
+ expect(person.title).to eq("Senorita")
173
187
  end
174
188
  end
175
189
 
@@ -182,15 +196,15 @@ describe Mongoid::Finders do
182
196
  end
183
197
 
184
198
  it "creates a persisted document" do
185
- person.should be_persisted
199
+ expect(person).to be_persisted
186
200
  end
187
201
 
188
202
  it "sets the attributes" do
189
- person.title.should eq("Senorita")
203
+ expect(person.title).to eq("Senorita")
190
204
  end
191
205
 
192
206
  it "calls the block" do
193
- person.pets.should be_true
207
+ expect(person.pets).to be true
194
208
  end
195
209
  end
196
210
  end
@@ -205,7 +219,7 @@ describe Mongoid::Finders do
205
219
  end
206
220
 
207
221
  it "returns the document" do
208
- Person.first_or_create.should eq(person)
222
+ expect(Person.first_or_create).to eq(person)
209
223
  end
210
224
  end
211
225
 
@@ -222,11 +236,11 @@ describe Mongoid::Finders do
222
236
  end
223
237
 
224
238
  it "returns the new document" do
225
- found.person.should eq(person)
239
+ expect(found.person).to eq(person)
226
240
  end
227
241
 
228
242
  it "does not save the document" do
229
- found.should_not be_persisted
243
+ expect(found).to_not be_persisted
230
244
  end
231
245
  end
232
246
 
@@ -241,11 +255,11 @@ describe Mongoid::Finders do
241
255
  end
242
256
 
243
257
  it "creates a non persisted document" do
244
- person.should_not be_persisted
258
+ expect(person).to_not be_persisted
245
259
  end
246
260
 
247
261
  it "sets the attributes" do
248
- person.title.should eq("esquire")
262
+ expect(person.title).to eq("esquire")
249
263
  end
250
264
  end
251
265
 
@@ -258,15 +272,15 @@ describe Mongoid::Finders do
258
272
  end
259
273
 
260
274
  it "creates a new document" do
261
- person.should_not be_persisted
275
+ expect(person).to_not be_persisted
262
276
  end
263
277
 
264
278
  it "sets the attributes" do
265
- person.title.should eq("Senorita")
279
+ expect(person.title).to eq("Senorita")
266
280
  end
267
281
 
268
282
  it "calls the block" do
269
- person.pets.should be_true
283
+ expect(person.pets).to be true
270
284
  end
271
285
  end
272
286
  end
@@ -293,7 +307,7 @@ describe Mongoid::Finders do
293
307
  end
294
308
 
295
309
  it "returns the field values" do
296
- plucked.should eq([ "Depeche Mode", "Tool", "Photek" ])
310
+ expect(plucked).to eq([ "Depeche Mode", "Tool", "Photek" ])
297
311
  end
298
312
  end
299
313
 
@@ -304,7 +318,7 @@ describe Mongoid::Finders do
304
318
  end
305
319
 
306
320
  it "returns an empty array" do
307
- plucked.should be_empty
321
+ expect(plucked).to be_empty
308
322
  end
309
323
  end
310
324
  end
@@ -314,8 +328,29 @@ describe Mongoid::Finders do
314
328
  describe "##{method}" do
315
329
 
316
330
  it "forwards the #{method} to the criteria" do
317
- Band.should respond_to(method)
331
+ expect(Band).to respond_to(method)
318
332
  end
319
333
  end
320
334
  end
335
+
336
+ describe "#text_search" do
337
+
338
+ before do
339
+ Word.with(database: "admin").mongo_session.command(setParameter: 1, textSearchEnabled: true)
340
+ Word.create_indexes
341
+ Word.create!(name: "phase", origin: "latin")
342
+ end
343
+
344
+ after(:all) do
345
+ Word.remove_indexes
346
+ end
347
+
348
+ let(:search) do
349
+ Word.text_search("phase")
350
+ end
351
+
352
+ it "returns all fields" do
353
+ expect(search.first.origin).to eq("latin")
354
+ end
355
+ end
321
356
  end
@@ -0,0 +1,102 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Indexable::Specification do
4
+
5
+ describe "#==" do
6
+
7
+ context "when the keys are different" do
8
+
9
+ let(:spec_one) do
10
+ described_class.new(Band, { name: 1 })
11
+ end
12
+
13
+ let(:spec_two) do
14
+ described_class.new(Band, { title: 1 })
15
+ end
16
+
17
+ it "returns false" do
18
+ expect(spec_one).to_not eq(spec_two)
19
+ end
20
+ end
21
+
22
+ context "when the keys are the same" do
23
+
24
+ let(:spec_one) do
25
+ described_class.new(Band, { name: 1 })
26
+ end
27
+
28
+ let(:spec_two) do
29
+ described_class.new(Band, { name: 1 })
30
+ end
31
+
32
+ it "returns true" do
33
+ expect(spec_one).to eq(spec_two)
34
+ end
35
+ end
36
+
37
+ context "when the keys are in different order" do
38
+
39
+ let(:spec_one) do
40
+ described_class.new(Band, { name: 1, title: -1 })
41
+ end
42
+
43
+ let(:spec_two) do
44
+ described_class.new(Band, { title: -1, name: 1 })
45
+ end
46
+
47
+ it "returns false" do
48
+ expect(spec_one).to_not eq(spec_two)
49
+ end
50
+ end
51
+
52
+ context "when the keys are the same with different value" do
53
+
54
+ let(:spec_one) do
55
+ described_class.new(Band, { name: 1, title: 1 })
56
+ end
57
+
58
+ let(:spec_two) do
59
+ described_class.new(Band, { name: 1, title: -1 })
60
+ end
61
+
62
+ it "returns false" do
63
+ expect(spec_one).to_not eq(spec_two)
64
+ end
65
+ end
66
+ end
67
+
68
+ describe "#fields" do
69
+
70
+ let(:spec) do
71
+ described_class.new(Band, { name: 1, title: 1 })
72
+ end
73
+
74
+ it "returns the key fields in order" do
75
+ expect(spec.fields).to eq([ :name, :title ])
76
+ end
77
+ end
78
+
79
+ describe "#initialize" do
80
+
81
+ let(:spec) do
82
+ described_class.new(
83
+ Band,
84
+ { name: 1, title: 1, years: -1 },
85
+ background: true,
86
+ drop_dups: true
87
+ )
88
+ end
89
+
90
+ it "sets the class" do
91
+ expect(spec.klass).to eq(Band)
92
+ end
93
+
94
+ it "normalizes the key" do
95
+ expect(spec.key).to eq(name: 1, title: 1, y: -1)
96
+ end
97
+
98
+ it "normalizes the options" do
99
+ expect(spec.options).to eq(background: true, dropDups: true)
100
+ end
101
+ end
102
+ end
@@ -1,21 +1,21 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Mongoid::Indexes do
3
+ describe Mongoid::Indexable do
4
4
 
5
5
  describe ".included" do
6
6
 
7
7
  let(:klass) do
8
8
  Class.new do
9
- include Mongoid::Indexes
9
+ include Mongoid::Indexable
10
10
  end
11
11
  end
12
12
 
13
- it "adds an index_options accessor" do
14
- klass.should respond_to(:index_options)
13
+ it "adds an index_specifications accessor" do
14
+ expect(klass).to respond_to(:index_specifications)
15
15
  end
16
16
 
17
- it "defaults index_options to empty hash" do
18
- klass.index_options.should eq({})
17
+ it "defaults index_specifications to empty array" do
18
+ expect(klass.index_specifications).to be_empty
19
19
  end
20
20
  end
21
21
 
@@ -37,7 +37,7 @@ describe Mongoid::Indexes do
37
37
  end
38
38
 
39
39
  it "removes the indexes" do
40
- collection.indexes.reject{ |doc| doc["name"] == "_id_" }.should be_empty
40
+ expect(collection.indexes.reject{ |doc| doc["name"] == "_id_" }).to be_empty
41
41
  end
42
42
  end
43
43
 
@@ -62,7 +62,7 @@ describe Mongoid::Indexes do
62
62
  end
63
63
 
64
64
  it "creates the indexes" do
65
- indexes.reject{ |doc| doc["name"] == "_id_" }.should be_empty
65
+ expect(indexes.reject{ |doc| doc["name"] == "_id_" }).to be_empty
66
66
  end
67
67
  end
68
68
  end
@@ -75,7 +75,7 @@ describe Mongoid::Indexes do
75
75
  Class.new do
76
76
  include Mongoid::Document
77
77
  store_in collection: "test_class"
78
- index({ _type: 1 }, { unique: false, background: true })
78
+ index({ _type: 1 }, unique: false, background: true)
79
79
  end
80
80
  end
81
81
 
@@ -84,7 +84,7 @@ describe Mongoid::Indexes do
84
84
  end
85
85
 
86
86
  it "creates the indexes" do
87
- klass.collection.indexes[_type: 1].should_not be_nil
87
+ expect(klass.collection.indexes[_type: 1]).to_not be_nil
88
88
  end
89
89
  end
90
90
 
@@ -107,7 +107,7 @@ describe Mongoid::Indexes do
107
107
  end
108
108
 
109
109
  it "creates the indexes" do
110
- indexes[_type: 1].should_not be_nil
110
+ expect(indexes[_type: 1]).to_not be_nil
111
111
  end
112
112
  end
113
113
  end
@@ -129,10 +129,12 @@ describe Mongoid::Indexes do
129
129
  klass.add_indexes
130
130
  end
131
131
 
132
+ let(:spec) do
133
+ klass.index_specification(_type: 1)
134
+ end
135
+
132
136
  it "adds the _type index" do
133
- klass.index_options[_type: 1].should eq(
134
- { unique: false, background: true }
135
- )
137
+ expect(spec.options).to eq(unique: false, background: true)
136
138
  end
137
139
  end
138
140
  end
@@ -149,105 +151,105 @@ describe Mongoid::Indexes do
149
151
  context "when indexing a field that is aliased" do
150
152
 
151
153
  before do
152
- klass.index({ authentication_token: 1 }, { unique: true })
154
+ klass.index({ authentication_token: 1 }, unique: true)
153
155
  end
154
156
 
155
157
  let(:options) do
156
- klass.index_options[a: 1]
158
+ klass.index_specification(a: 1).options
157
159
  end
158
160
 
159
161
  it "sets the index with unique options" do
160
- options.should eq(unique: true)
162
+ expect(options).to eq(unique: true)
161
163
  end
162
164
  end
163
165
 
164
166
  context "when providing unique options" do
165
167
 
166
168
  before do
167
- klass.index({ name: 1 }, { unique: true })
169
+ klass.index({ name: 1 }, unique: true)
168
170
  end
169
171
 
170
172
  let(:options) do
171
- klass.index_options[name: 1]
173
+ klass.index_specification(name: 1).options
172
174
  end
173
175
 
174
176
  it "sets the index with unique options" do
175
- options.should eq(unique: true)
177
+ expect(options).to eq(unique: true)
176
178
  end
177
179
  end
178
180
 
179
181
  context "when providing a drop_dups option" do
180
182
 
181
183
  before do
182
- klass.index({ name: 1 }, { drop_dups: true })
184
+ klass.index({ name: 1 }, drop_dups: true)
183
185
  end
184
186
 
185
187
  let(:options) do
186
- klass.index_options[name: 1]
188
+ klass.index_specification(name: 1).options
187
189
  end
188
190
 
189
191
  it "sets the index with dropDups options" do
190
- options.should eq(dropDups: true)
192
+ expect(options).to eq(dropDups: true)
191
193
  end
192
194
  end
193
195
 
194
196
  context "when providing a sparse option" do
195
197
 
196
198
  before do
197
- klass.index({ name: 1 }, { sparse: true })
199
+ klass.index({ name: 1 }, sparse: true)
198
200
  end
199
201
 
200
202
  let(:options) do
201
- klass.index_options[name: 1]
203
+ klass.index_specification(name: 1).options
202
204
  end
203
205
 
204
206
  it "sets the index with sparse options" do
205
- options.should eq(sparse: true)
207
+ expect(options).to eq(sparse: true)
206
208
  end
207
209
  end
208
210
 
209
211
  context "when providing a name option" do
210
212
 
211
213
  before do
212
- klass.index({ name: 1 }, { name: "index_name" })
214
+ klass.index({ name: 1 }, name: "index_name")
213
215
  end
214
216
 
215
217
  let(:options) do
216
- klass.index_options[name: 1]
218
+ klass.index_specification(name: 1).options
217
219
  end
218
220
 
219
221
  it "sets the index with name options" do
220
- options.should eq(name: "index_name")
222
+ expect(options).to eq(name: "index_name")
221
223
  end
222
224
  end
223
225
 
224
226
  context "when providing database options" do
225
227
 
226
228
  before do
227
- klass.index({ name: 1 }, { database: "mongoid_index_alt" })
229
+ klass.index({ name: 1 }, database: "mongoid_index_alt")
228
230
  end
229
231
 
230
232
  let(:options) do
231
- klass.index_options[name: 1]
233
+ klass.index_specification(name: 1).options
232
234
  end
233
235
 
234
236
  it "sets the index with background options" do
235
- options.should eq(database: "mongoid_index_alt")
237
+ expect(options).to eq(database: "mongoid_index_alt")
236
238
  end
237
239
  end
238
240
 
239
241
  context "when providing a background option" do
240
242
 
241
243
  before do
242
- klass.index({ name: 1 }, { background: true })
244
+ klass.index({ name: 1 }, background: true)
243
245
  end
244
246
 
245
247
  let(:options) do
246
- klass.index_options[name: 1]
248
+ klass.index_specification(name: 1).options
247
249
  end
248
250
 
249
251
  it "sets the index with background options" do
250
- options.should eq(background: true)
252
+ expect(options).to eq(background: true)
251
253
  end
252
254
  end
253
255
 
@@ -258,11 +260,51 @@ describe Mongoid::Indexes do
258
260
  end
259
261
 
260
262
  let(:options) do
261
- klass.index_options[name: 1, title: -1]
263
+ klass.index_specification(name: 1, title: -1).options
262
264
  end
263
265
 
264
266
  it "sets the compound key index" do
265
- options.should be_empty
267
+ expect(options).to be_empty
268
+ end
269
+ end
270
+
271
+ context "when providing multiple inverse compound indexes" do
272
+
273
+ before do
274
+ klass.index({ name: 1, title: -1 })
275
+ klass.index({ title: -1, name: 1 })
276
+ end
277
+
278
+ let(:first_spec) do
279
+ klass.index_specification(name: 1, title: -1)
280
+ end
281
+
282
+ let(:second_spec) do
283
+ klass.index_specification(title: -1, name: 1)
284
+ end
285
+
286
+ it "does not overwrite the index options" do
287
+ expect(first_spec).to_not eq(second_spec)
288
+ end
289
+ end
290
+
291
+ context "when providing multiple compound indexes with different order" do
292
+
293
+ before do
294
+ klass.index({ name: 1, title: -1 })
295
+ klass.index({ name: 1, title: 1 })
296
+ end
297
+
298
+ let(:first_spec) do
299
+ klass.index_specification(name: 1, title: -1)
300
+ end
301
+
302
+ let(:second_spec) do
303
+ klass.index_specification(name: 1, title: 1)
304
+ end
305
+
306
+ it "does not overwrite the index options" do
307
+ expect(first_spec).to_not eq(second_spec)
266
308
  end
267
309
  end
268
310
 
@@ -273,11 +315,11 @@ describe Mongoid::Indexes do
273
315
  end
274
316
 
275
317
  let(:options) do
276
- klass.index_options[location: "2d"]
318
+ klass.index_specification(location: "2d").options
277
319
  end
278
320
 
279
321
  it "sets the geospacial index" do
280
- options.should eq({ min: -200, max: 200, bits: 32 })
322
+ expect(options).to eq({ min: -200, max: 200, bits: 32 })
281
323
  end
282
324
  end
283
325
 
@@ -288,11 +330,11 @@ describe Mongoid::Indexes do
288
330
  end
289
331
 
290
332
  let(:options) do
291
- klass.index_options[location: "geoHaystack"]
333
+ klass.index_specification(location: "geoHaystack").options
292
334
  end
293
335
 
294
336
  it "sets the geo haystack index" do
295
- options.should eq({ min: -200, max: 200, bucketSize: 0.5 })
337
+ expect(options).to eq({ min: -200, max: 200, bucketSize: 0.5 })
296
338
  end
297
339
  end
298
340
 
@@ -303,11 +345,89 @@ describe Mongoid::Indexes do
303
345
  end
304
346
 
305
347
  let(:options) do
306
- klass.index_options[location: "2dsphere"]
348
+ klass.index_specification(location: "2dsphere").options
307
349
  end
308
350
 
309
351
  it "sets the spherical geospatial index" do
310
- options.should be_empty
352
+ expect(options).to be_empty
353
+ end
354
+ end
355
+
356
+ context "when providing a text index" do
357
+
358
+ context "when the index is a single field" do
359
+
360
+ before do
361
+ klass.index({ description: "text" })
362
+ end
363
+
364
+ let(:options) do
365
+ klass.index_specification(description: "text").options
366
+ end
367
+
368
+ it "allows the set of the text index" do
369
+ expect(options).to be_empty
370
+ end
371
+ end
372
+
373
+ context "when the index is multiple fields" do
374
+
375
+ before do
376
+ klass.index({ description: "text", name: "text" })
377
+ end
378
+
379
+ let(:options) do
380
+ klass.index_specification(description: "text", name: "text").options
381
+ end
382
+
383
+ it "allows the set of the text index" do
384
+ expect(options).to be_empty
385
+ end
386
+ end
387
+
388
+ context "when the index is all string fields" do
389
+
390
+ before do
391
+ klass.index({ "$**" => "text" })
392
+ end
393
+
394
+ let(:options) do
395
+ klass.index_specification(:"$**" => "text").options
396
+ end
397
+
398
+ it "allows the set of the text index" do
399
+ expect(options).to be_empty
400
+ end
401
+ end
402
+
403
+ context "when providing a default language" do
404
+
405
+ before do
406
+ klass.index({ description: "text" }, default_language: "english")
407
+ end
408
+
409
+ let(:options) do
410
+ klass.index_specification(description: "text").options
411
+ end
412
+
413
+ it "allows the set of the text index" do
414
+ expect(options).to eq(default_language: "english")
415
+ end
416
+ end
417
+
418
+ context "when providing a name" do
419
+
420
+ before do
421
+ klass.index({ description: "text" }, name: "text_index")
422
+ end
423
+
424
+ let(:options) do
425
+ klass.index_specification(description: "text").options
426
+ end
427
+
428
+ it "allows the set of the text index" do
429
+ expect(options).to eq(name: "text_index")
430
+ end
311
431
  end
312
432
  end
313
433
 
@@ -318,11 +438,11 @@ describe Mongoid::Indexes do
318
438
  end
319
439
 
320
440
  let(:options) do
321
- klass.index_options[a: "hashed"]
441
+ klass.index_specification(a: "hashed").options
322
442
  end
323
443
 
324
444
  it "sets the hashed index" do
325
- options.should be_empty
445
+ expect(options).to be_empty
326
446
  end
327
447
  end
328
448
 
@@ -333,11 +453,11 @@ describe Mongoid::Indexes do
333
453
  end
334
454
 
335
455
  let(:options) do
336
- klass.index_options[content: "text"]
456
+ klass.index_specification(content: "text").options
337
457
  end
338
458
 
339
459
  it "sets the text index" do
340
- options.should be_empty
460
+ expect(options).to be_empty
341
461
  end
342
462
  end
343
463
 
@@ -348,11 +468,11 @@ describe Mongoid::Indexes do
348
468
  end
349
469
 
350
470
  let(:options) do
351
- klass.index_options[content: "text", title: "text"]
471
+ klass.index_specification(content: "text", title: "text").options
352
472
  end
353
473
 
354
474
  it "sets the compound text index" do
355
- options.should eq(weights: { content: 1, title: 2 })
475
+ expect(options).to eq(weights: { content: 1, title: 2 })
356
476
  end
357
477
  end
358
478
 
@@ -363,11 +483,11 @@ describe Mongoid::Indexes do
363
483
  end
364
484
 
365
485
  let(:options) do
366
- klass.index_options[name: 1]
486
+ klass.index_specification(name: 1).options
367
487
  end
368
488
 
369
489
  it "sets the index with sparse options" do
370
- options.should eq(expireAfterSeconds: 3600)
490
+ expect(options).to eq(expireAfterSeconds: 3600)
371
491
  end
372
492
  end
373
493