mongoid 5.4.0 → 6.4.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (301) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +3 -3
  4. data/Rakefile +26 -0
  5. data/lib/config/locales/en.yml +40 -0
  6. data/lib/mongoid/atomic/modifiers.rb +2 -2
  7. data/lib/mongoid/atomic.rb +5 -5
  8. data/lib/mongoid/attributes/readonly.rb +22 -0
  9. data/lib/mongoid/attributes.rb +22 -21
  10. data/lib/mongoid/cacheable.rb +36 -0
  11. data/lib/mongoid/changeable.rb +36 -0
  12. data/lib/mongoid/clients/options.rb +55 -250
  13. data/lib/mongoid/clients/sessions.rb +113 -0
  14. data/lib/mongoid/clients/storage_options.rb +2 -69
  15. data/lib/mongoid/clients.rb +10 -63
  16. data/lib/mongoid/composable.rb +29 -2
  17. data/lib/mongoid/config.rb +1 -0
  18. data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
  19. data/lib/mongoid/contextual/atomic.rb +4 -4
  20. data/lib/mongoid/contextual/map_reduce.rb +7 -3
  21. data/lib/mongoid/contextual/memory.rb +9 -4
  22. data/lib/mongoid/contextual/mongo.rb +65 -30
  23. data/lib/mongoid/contextual/none.rb +12 -0
  24. data/lib/mongoid/copyable.rb +13 -6
  25. data/lib/mongoid/criteria/marshalable.rb +2 -2
  26. data/lib/mongoid/criteria/modifiable.rb +29 -3
  27. data/lib/mongoid/criteria/options.rb +25 -0
  28. data/lib/mongoid/criteria/queryable/aggregable.rb +120 -0
  29. data/lib/mongoid/criteria/queryable/extensions/array.rb +185 -0
  30. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +37 -0
  31. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +34 -0
  32. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  33. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +53 -0
  34. data/lib/mongoid/criteria/queryable/extensions/hash.rb +200 -0
  35. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +86 -0
  36. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +90 -0
  37. data/lib/mongoid/criteria/queryable/extensions/object.rb +206 -0
  38. data/lib/mongoid/criteria/queryable/extensions/range.rb +70 -0
  39. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +79 -0
  40. data/lib/mongoid/criteria/queryable/extensions/set.rb +34 -0
  41. data/lib/mongoid/criteria/queryable/extensions/string.rb +137 -0
  42. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +79 -0
  43. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  44. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +54 -0
  45. data/lib/mongoid/criteria/queryable/extensions.rb +28 -0
  46. data/lib/mongoid/criteria/queryable/forwardable.rb +65 -0
  47. data/lib/mongoid/criteria/queryable/key.rb +103 -0
  48. data/lib/mongoid/criteria/queryable/macroable.rb +27 -0
  49. data/lib/mongoid/criteria/queryable/mergeable.rb +273 -0
  50. data/lib/mongoid/criteria/queryable/optional.rb +429 -0
  51. data/lib/mongoid/criteria/queryable/options.rb +153 -0
  52. data/lib/mongoid/criteria/queryable/pipeline.rb +111 -0
  53. data/lib/mongoid/criteria/queryable/selectable.rb +689 -0
  54. data/lib/mongoid/criteria/queryable/selector.rb +212 -0
  55. data/lib/mongoid/criteria/queryable/smash.rb +104 -0
  56. data/lib/mongoid/criteria/queryable.rb +87 -0
  57. data/lib/mongoid/criteria.rb +6 -2
  58. data/lib/mongoid/document.rb +34 -41
  59. data/lib/mongoid/errors/ambiguous_relationship.rb +1 -1
  60. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -1
  61. data/lib/mongoid/errors/invalid_field.rb +2 -2
  62. data/lib/mongoid/errors/invalid_persistence_option.rb +29 -0
  63. data/lib/mongoid/errors/invalid_relation.rb +66 -0
  64. data/lib/mongoid/errors/invalid_session_use.rb +24 -0
  65. data/lib/mongoid/errors.rb +3 -0
  66. data/lib/mongoid/evolvable.rb +1 -1
  67. data/lib/mongoid/extensions/big_decimal.rb +17 -8
  68. data/lib/mongoid/extensions/date.rb +4 -1
  69. data/lib/mongoid/extensions/decimal128.rb +3 -3
  70. data/lib/mongoid/extensions/hash.rb +1 -0
  71. data/lib/mongoid/extensions/regexp.rb +1 -0
  72. data/lib/mongoid/extensions/string.rb +6 -3
  73. data/lib/mongoid/extensions/time.rb +4 -1
  74. data/lib/mongoid/extensions.rb +0 -4
  75. data/lib/mongoid/factory.rb +2 -1
  76. data/lib/mongoid/fields/validators/macro.rb +18 -0
  77. data/lib/mongoid/findable.rb +2 -2
  78. data/lib/mongoid/indexable.rb +16 -14
  79. data/lib/mongoid/interceptable.rb +9 -22
  80. data/lib/mongoid/matchable/all.rb +2 -2
  81. data/lib/mongoid/matchable/and.rb +3 -3
  82. data/lib/mongoid/matchable/default.rb +2 -2
  83. data/lib/mongoid/matchable/elem_match.rb +28 -0
  84. data/lib/mongoid/matchable/exists.rb +2 -2
  85. data/lib/mongoid/matchable/gt.rb +4 -2
  86. data/lib/mongoid/matchable/gte.rb +4 -2
  87. data/lib/mongoid/matchable/in.rb +2 -2
  88. data/lib/mongoid/matchable/lt.rb +4 -2
  89. data/lib/mongoid/matchable/lte.rb +4 -2
  90. data/lib/mongoid/matchable/ne.rb +2 -2
  91. data/lib/mongoid/matchable/nin.rb +2 -2
  92. data/lib/mongoid/matchable/nor.rb +37 -0
  93. data/lib/mongoid/matchable/or.rb +3 -3
  94. data/lib/mongoid/matchable/regexp.rb +3 -3
  95. data/lib/mongoid/matchable/size.rb +2 -2
  96. data/lib/mongoid/matchable.rb +16 -7
  97. data/lib/mongoid/persistable/creatable.rb +5 -3
  98. data/lib/mongoid/persistable/deletable.rb +5 -3
  99. data/lib/mongoid/persistable/destroyable.rb +1 -5
  100. data/lib/mongoid/persistable/settable.rb +5 -5
  101. data/lib/mongoid/persistable/updatable.rb +7 -14
  102. data/lib/mongoid/persistable/upsertable.rb +2 -1
  103. data/lib/mongoid/persistable.rb +4 -6
  104. data/lib/mongoid/persistence_context.rb +220 -0
  105. data/lib/mongoid/query_cache.rb +67 -23
  106. data/lib/mongoid/railtie.rb +17 -1
  107. data/lib/mongoid/railties/controller_runtime.rb +86 -0
  108. data/lib/mongoid/relations/accessors.rb +3 -0
  109. data/lib/mongoid/relations/auto_save.rb +12 -4
  110. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -4
  111. data/lib/mongoid/relations/counter_cache.rb +15 -5
  112. data/lib/mongoid/relations/eager/base.rb +3 -3
  113. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +2 -2
  114. data/lib/mongoid/relations/eager/has_many.rb +1 -1
  115. data/lib/mongoid/relations/eager.rb +6 -11
  116. data/lib/mongoid/relations/embedded/batchable.rb +20 -18
  117. data/lib/mongoid/relations/embedded/in.rb +13 -1
  118. data/lib/mongoid/relations/embedded/many.rb +51 -10
  119. data/lib/mongoid/relations/embedded/one.rb +14 -1
  120. data/lib/mongoid/relations/macros.rb +9 -1
  121. data/lib/mongoid/relations/many.rb +4 -0
  122. data/lib/mongoid/relations/metadata.rb +3 -3
  123. data/lib/mongoid/relations/options.rb +2 -2
  124. data/lib/mongoid/relations/proxy.rb +1 -31
  125. data/lib/mongoid/relations/referenced/in.rb +19 -10
  126. data/lib/mongoid/relations/referenced/many.rb +30 -26
  127. data/lib/mongoid/relations/referenced/many_to_many.rb +20 -13
  128. data/lib/mongoid/relations/referenced/one.rb +15 -1
  129. data/lib/mongoid/relations/synchronization.rb +12 -12
  130. data/lib/mongoid/relations/targets/enumerable.rb +24 -4
  131. data/lib/mongoid/relations/touchable.rb +7 -4
  132. data/lib/mongoid/reloadable.rb +2 -2
  133. data/lib/mongoid/scopable.rb +3 -3
  134. data/lib/mongoid/serializable.rb +1 -1
  135. data/lib/mongoid/stateful.rb +1 -0
  136. data/lib/mongoid/tasks/database.rb +3 -2
  137. data/lib/mongoid/threaded.rb +74 -0
  138. data/lib/mongoid/traversable.rb +1 -1
  139. data/lib/mongoid/validatable/uniqueness.rb +1 -2
  140. data/lib/mongoid/version.rb +1 -1
  141. data/lib/mongoid.rb +6 -6
  142. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +18 -3
  143. data/spec/app/models/agent.rb +2 -0
  144. data/spec/app/models/album.rb +5 -1
  145. data/spec/app/models/array_field.rb +7 -0
  146. data/spec/app/models/artist.rb +21 -0
  147. data/spec/app/models/band.rb +3 -0
  148. data/spec/app/models/book.rb +2 -1
  149. data/spec/app/models/delegating_patient.rb +16 -0
  150. data/spec/app/models/dokument.rb +1 -0
  151. data/spec/app/models/ordered_post.rb +5 -0
  152. data/spec/app/models/oscar.rb +1 -2
  153. data/spec/app/models/page.rb +1 -1
  154. data/spec/app/models/person.rb +3 -3
  155. data/spec/app/models/princess.rb +2 -0
  156. data/spec/app/models/record.rb +1 -0
  157. data/spec/app/models/subscription.rb +1 -0
  158. data/spec/app/models/thing.rb +1 -1
  159. data/spec/config/mongoid.yml +15 -0
  160. data/spec/integration/document_spec.rb +22 -0
  161. data/spec/mongoid/atomic/modifiers_spec.rb +3 -3
  162. data/spec/mongoid/atomic_spec.rb +5 -5
  163. data/spec/mongoid/attributes/nested_spec.rb +18 -14
  164. data/spec/mongoid/attributes/readonly_spec.rb +87 -44
  165. data/spec/mongoid/attributes_spec.rb +90 -5
  166. data/spec/mongoid/cacheable_spec.rb +112 -0
  167. data/spec/mongoid/changeable_spec.rb +58 -0
  168. data/spec/mongoid/clients/factory_spec.rb +80 -28
  169. data/spec/mongoid/clients/options_spec.rb +396 -95
  170. data/spec/mongoid/clients/sessions_spec.rb +334 -0
  171. data/spec/mongoid/clients_spec.rb +243 -101
  172. data/spec/mongoid/composable_spec.rb +7 -0
  173. data/spec/mongoid/config_spec.rb +67 -11
  174. data/spec/mongoid/contextual/atomic_spec.rb +3 -3
  175. data/spec/mongoid/contextual/geo_near_spec.rb +1 -0
  176. data/spec/mongoid/contextual/mongo_spec.rb +275 -22
  177. data/spec/mongoid/contextual/none_spec.rb +15 -0
  178. data/spec/mongoid/copyable_spec.rb +13 -4
  179. data/spec/mongoid/criteria/modifiable_spec.rb +297 -16
  180. data/spec/mongoid/criteria/options_spec.rb +29 -0
  181. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +370 -0
  182. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +523 -0
  183. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +59 -0
  184. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +58 -0
  185. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +213 -0
  186. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +330 -0
  187. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +405 -0
  188. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +58 -0
  189. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +65 -0
  190. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +327 -0
  191. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +65 -0
  192. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +77 -0
  193. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +108 -0
  194. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +309 -0
  195. data/spec/mongoid/{extensions/origin → criteria/queryable/extensions}/regexp_raw_spec.rb +2 -2
  196. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +90 -0
  197. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +39 -0
  198. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +302 -0
  199. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +167 -0
  200. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +376 -0
  201. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +347 -0
  202. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +87 -0
  203. data/spec/mongoid/criteria/queryable/key_spec.rb +52 -0
  204. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +49 -0
  205. data/spec/mongoid/criteria/queryable/optional_spec.rb +1799 -0
  206. data/spec/mongoid/criteria/queryable/options_spec.rb +360 -0
  207. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +200 -0
  208. data/spec/mongoid/criteria/queryable/queryable_spec.rb +137 -0
  209. data/spec/mongoid/criteria/queryable/selectable_spec.rb +4242 -0
  210. data/spec/mongoid/criteria/queryable/selector_spec.rb +844 -0
  211. data/spec/mongoid/criteria/queryable/smash_spec.rb +30 -0
  212. data/spec/mongoid/criteria/scopable_spec.rb +81 -0
  213. data/spec/mongoid/criteria_spec.rb +156 -22
  214. data/spec/mongoid/document_spec.rb +100 -90
  215. data/spec/mongoid/errors/invalid_relation_spec.rb +37 -0
  216. data/spec/mongoid/errors/mongoid_error_spec.rb +6 -3
  217. data/spec/mongoid/extensions/big_decimal_spec.rb +321 -19
  218. data/spec/mongoid/extensions/boolean_spec.rb +14 -0
  219. data/spec/mongoid/extensions/date_spec.rb +2 -6
  220. data/spec/mongoid/extensions/date_time_spec.rb +2 -6
  221. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  222. data/spec/mongoid/extensions/float_spec.rb +8 -1
  223. data/spec/mongoid/extensions/hash_spec.rb +15 -0
  224. data/spec/mongoid/extensions/integer_spec.rb +8 -1
  225. data/spec/mongoid/extensions/object_spec.rb +11 -0
  226. data/spec/mongoid/extensions/regexp_spec.rb +23 -0
  227. data/spec/mongoid/extensions/string_spec.rb +53 -4
  228. data/spec/mongoid/extensions/time_spec.rb +2 -6
  229. data/spec/mongoid/extensions/time_with_zone_spec.rb +2 -6
  230. data/spec/mongoid/factory_spec.rb +11 -0
  231. data/spec/mongoid/fields_spec.rb +1 -1
  232. data/spec/mongoid/findable_spec.rb +47 -2
  233. data/spec/mongoid/indexable_spec.rb +15 -3
  234. data/spec/mongoid/interceptable_spec.rb +85 -19
  235. data/spec/mongoid/matchable/all_spec.rb +4 -4
  236. data/spec/mongoid/matchable/and_spec.rb +10 -10
  237. data/spec/mongoid/matchable/default_spec.rb +12 -12
  238. data/spec/mongoid/matchable/elem_match_spec.rb +86 -0
  239. data/spec/mongoid/matchable/exists_spec.rb +5 -5
  240. data/spec/mongoid/matchable/gt_spec.rb +18 -7
  241. data/spec/mongoid/matchable/gte_spec.rb +17 -7
  242. data/spec/mongoid/matchable/in_spec.rb +5 -5
  243. data/spec/mongoid/matchable/lt_spec.rb +18 -7
  244. data/spec/mongoid/matchable/lte_spec.rb +18 -7
  245. data/spec/mongoid/matchable/ne_spec.rb +5 -5
  246. data/spec/mongoid/matchable/nin_spec.rb +5 -5
  247. data/spec/mongoid/matchable/nor_spec.rb +209 -0
  248. data/spec/mongoid/matchable/or_spec.rb +7 -7
  249. data/spec/mongoid/matchable/regexp_spec.rb +5 -5
  250. data/spec/mongoid/matchable/size_spec.rb +3 -3
  251. data/spec/mongoid/matchable_spec.rb +199 -54
  252. data/spec/mongoid/persistable/creatable_spec.rb +7 -2
  253. data/spec/mongoid/persistable/deletable_spec.rb +35 -1
  254. data/spec/mongoid/persistable/destroyable_spec.rb +25 -2
  255. data/spec/mongoid/persistable/incrementable_spec.rb +6 -6
  256. data/spec/mongoid/persistable/savable_spec.rb +34 -29
  257. data/spec/mongoid/persistable/settable_spec.rb +77 -27
  258. data/spec/mongoid/persistable/updatable_spec.rb +182 -3
  259. data/spec/mongoid/persistable_spec.rb +16 -16
  260. data/spec/mongoid/persistence_context_spec.rb +694 -0
  261. data/spec/mongoid/positional_spec.rb +1 -1
  262. data/spec/mongoid/query_cache_spec.rb +170 -12
  263. data/spec/mongoid/relations/accessors_spec.rb +1 -1
  264. data/spec/mongoid/relations/auto_save_spec.rb +39 -6
  265. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +4 -4
  266. data/spec/mongoid/relations/builders_spec.rb +37 -10
  267. data/spec/mongoid/relations/counter_cache_spec.rb +64 -3
  268. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +16 -0
  269. data/spec/mongoid/relations/eager_spec.rb +40 -0
  270. data/spec/mongoid/relations/embedded/many_spec.rb +305 -59
  271. data/spec/mongoid/relations/embedded/one_spec.rb +2 -1
  272. data/spec/mongoid/relations/macros_spec.rb +415 -7
  273. data/spec/mongoid/relations/metadata_spec.rb +15 -1
  274. data/spec/mongoid/relations/proxy_spec.rb +27 -1
  275. data/spec/mongoid/relations/referenced/in_spec.rb +41 -1
  276. data/spec/mongoid/relations/referenced/many_spec.rb +35 -25
  277. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +14 -26
  278. data/spec/mongoid/relations/synchronization_spec.rb +48 -2
  279. data/spec/mongoid/relations/targets/enumerable_spec.rb +108 -0
  280. data/spec/mongoid/relations/touchable_spec.rb +40 -0
  281. data/spec/mongoid/reloadable_spec.rb +51 -0
  282. data/spec/mongoid/scopable_spec.rb +13 -0
  283. data/spec/mongoid/serializable_spec.rb +0 -50
  284. data/spec/mongoid/threaded_spec.rb +68 -0
  285. data/spec/mongoid/validatable/presence_spec.rb +1 -1
  286. data/spec/mongoid/validatable/uniqueness_spec.rb +18 -9
  287. data/spec/mongoid/validatable_spec.rb +16 -0
  288. data/spec/rails/controller_extension/controller_runtime_spec.rb +110 -0
  289. data/spec/spec_helper.rb +101 -8
  290. data/spec/support/cluster_config.rb +158 -0
  291. data/spec/support/constraints.rb +101 -0
  292. data/spec/support/macros.rb +20 -0
  293. data/spec/support/session_registry.rb +50 -0
  294. data/spec/support/spec_config.rb +42 -0
  295. data.tar.gz.sig +0 -0
  296. metadata +163 -61
  297. metadata.gz.sig +0 -0
  298. data/lib/mongoid/clients/thread_options.rb +0 -19
  299. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  300. data/lib/mongoid/railties/document.rb +0 -12
  301. data/spec/mongoid/railties/document_spec.rb +0 -24
data/lib/mongoid.rb CHANGED
@@ -12,11 +12,11 @@ require "active_support/inflector"
12
12
  require "active_support/time_with_zone"
13
13
  require "active_model"
14
14
 
15
- require "origin"
16
15
  require "mongo"
17
16
 
18
17
  require "mongoid/version"
19
18
  require "mongoid/config"
19
+ require "mongoid/persistence_context"
20
20
  require "mongoid/loggable"
21
21
  require "mongoid/clients"
22
22
  require "mongoid/document"
@@ -42,7 +42,7 @@ module Mongoid
42
42
  PLATFORM_DETAILS = "mongoid-#{VERSION}".freeze
43
43
 
44
44
  # The minimum MongoDB version supported.
45
- MONGODB_VERSION = "2.4.0"
45
+ MONGODB_VERSION = "2.6.0"
46
46
 
47
47
  # Sets the Mongoid configuration options. Best used by passing a block.
48
48
  #
@@ -65,7 +65,7 @@ module Mongoid
65
65
  #
66
66
  # @return [ Mongo::Client ] The default client.
67
67
  #
68
- # @since 3.0.0
68
+ # @since 5.0.0
69
69
  def default_client
70
70
  Clients.default
71
71
  end
@@ -77,7 +77,7 @@ module Mongoid
77
77
  #
78
78
  # @return [ true ] True.
79
79
  #
80
- # @since 3.1.0
80
+ # @since 5.0.0
81
81
  def disconnect_clients
82
82
  Clients.disconnect
83
83
  end
@@ -89,7 +89,7 @@ module Mongoid
89
89
  #
90
90
  # @return [ Mongo::Client ] The named client.
91
91
  #
92
- # @since 3.0.0
92
+ # @since 5.0.0
93
93
  def client(name)
94
94
  Clients.with_name(name)
95
95
  end
@@ -101,5 +101,5 @@ module Mongoid
101
101
  # Mongoid.database = Mongo::Connection.new.db("test")
102
102
  #
103
103
  # @since 1.0.0
104
- delegate(*(Config.public_instance_methods(false) - [ :logger=, :logger ] << { to: Config }))
104
+ delegate(*(Config.public_instance_methods(false) - [ :logger=, :logger ]), to: Config)
105
105
  end
@@ -11,6 +11,10 @@ development:
11
11
  hosts:
12
12
  - localhost:27017
13
13
  options:
14
+ # Note that all options listed below are Ruby driver client options (the mongo gem).
15
+ # Please refer to the driver documentation of the version of the mongo gem you are using
16
+ # for the most up-to-date list of options.
17
+ #
14
18
  # Change the default write concern. (default = { w: 1 })
15
19
  # write:
16
20
  # w: 1
@@ -34,11 +38,13 @@ development:
34
38
  # - 'dbOwner'
35
39
 
36
40
  # Change the default authentication mechanism. Valid options are: :scram,
37
- # :mongodb_cr, :mongodb_x509, and :plain. (default on 3.0 is :scram, default
38
- # on 2.4 and 2.6 is :plain)
41
+ # :mongodb_cr, :mongodb_x509, and :plain. Note that all authentication
42
+ # mechanisms require username and password, with the exception of :mongodb_x509.
43
+ # Default on mongoDB 3.0 is :scram, default on 2.4 and 2.6 is :plain.
39
44
  # auth_mech: :scram
40
45
 
41
- # The database or source to authenticate the user against. (default: admin)
46
+ # The database or source to authenticate the user against.
47
+ # (default: the database specified above or admin)
42
48
  # auth_source: admin
43
49
 
44
50
  # Force a the driver cluster to behave in a certain manner instead of auto-
@@ -120,6 +126,10 @@ development:
120
126
  # existing method. (default: false)
121
127
  # scope_overwrite_exception: false
122
128
 
129
+ # Raise an error when defining a field with the same name as an
130
+ # existing method. (default: false)
131
+ # duplicate_fields_exception: false
132
+
123
133
  # Use Active Support's time zone in conversions. (default: true)
124
134
  # use_activesupport_time_zone: true
125
135
 
@@ -131,6 +141,11 @@ development:
131
141
  # otherwise.(default: :info)
132
142
  # log_level: :info
133
143
 
144
+ # Control whether `belongs_to` association is required. By default
145
+ # `belongs_to` will trigger a validation error if the association
146
+ # is not present. (default: true)
147
+ # belongs_to_required_by_default: true
148
+
134
149
  # Application name that is printed to the mongodb logs upon establishing a
135
150
  # connection in server versions >= 3.4. Note that the name cannot exceed 128 bytes.
136
151
  # app_name: MyApplicationName
@@ -9,6 +9,8 @@ class Agent
9
9
  belongs_to :game
10
10
  belongs_to :agency, touch: true, autobuild: true
11
11
 
12
+ belongs_to :same_name, class_name: 'Band', inverse_of: :same_name
13
+
12
14
  has_and_belongs_to_many :accounts
13
15
  has_and_belongs_to_many :basics
14
16
  end
@@ -9,6 +9,10 @@ class Album
9
9
  private
10
10
 
11
11
  def set_parent_name
12
- artist.name = "destroyed"
12
+ artist.name = "destroyed" if artist
13
+ end
14
+
15
+ def set_parent_name_fail
16
+ throw(:abort)
13
17
  end
14
18
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ArrayField
4
+ include Mongoid::Document
5
+
6
+ field :af, type: Array
7
+ end
@@ -13,16 +13,37 @@ class Artist
13
13
  after_create :create_songs
14
14
  before_save :before_save_stub
15
15
  before_destroy :before_destroy_stub
16
+ before_update :before_update_stub
16
17
 
17
18
  protected
18
19
  def before_create_stub
19
20
  true
20
21
  end
21
22
 
23
+ def before_update_stub
24
+ true
25
+ end
26
+
27
+ def before_update_fail_stub
28
+ throw(:abort)
29
+ end
30
+
31
+ def before_save_fail_stub
32
+ throw(:abort)
33
+ end
34
+
35
+ def before_create_fail_stub
36
+ throw(:abort)
37
+ end
38
+
22
39
  def before_save_stub
23
40
  true
24
41
  end
25
42
 
43
+ def before_destroy_fail_stub
44
+ throw(:abort)
45
+ end
46
+
26
47
  def before_destroy_stub
27
48
  true
28
49
  end
@@ -20,8 +20,11 @@ class Band
20
20
 
21
21
  embeds_many :records, cascade_callbacks: true
22
22
  embeds_many :notes, as: :noteable, cascade_callbacks: true, validate: false
23
+ embeds_many :labels
23
24
  embeds_one :label, cascade_callbacks: true
24
25
 
26
+ has_many :same_name, class_name: 'Agent', inverse_of: :same_name
27
+
25
28
  after_upsert do |doc|
26
29
  doc.upserted = true
27
30
  end
@@ -1,6 +1,7 @@
1
1
  class Book
2
2
  include Mongoid::Document
3
3
  include Mongoid::Attributes::Dynamic
4
+ include Mongoid::Timestamps
4
5
  field :title, type: String
5
6
  field :chapters, type: Integer
6
7
  belongs_to :series
@@ -11,5 +12,5 @@ class Book
11
12
  doc.chapters = 5
12
13
  end
13
14
 
14
- embeds_many :pages
15
+ embeds_many :pages, cascade_callbacks: true
15
16
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ class DelegatingPatient
5
+ include Mongoid::Document
6
+
7
+ embeds_one :email
8
+
9
+ # Instance level delegation
10
+ delegate :address, to: :email
11
+
12
+ class << self
13
+ # Class level delegation
14
+ delegate :default_client, to: ::Mongoid
15
+ end
16
+ end
@@ -2,4 +2,5 @@ class Dokument
2
2
  include Mongoid::Document
3
3
  include Mongoid::Timestamps
4
4
  embeds_many :addresses, as: :addressable, validate: false
5
+ field :title
5
6
  end
@@ -3,4 +3,9 @@ class OrderedPost
3
3
  field :title, type: String
4
4
  field :rating, type: Integer
5
5
  belongs_to :person
6
+
7
+ after_destroy do
8
+ person.title = 'Minus one ordered post.'
9
+ person.save
10
+ end
6
11
  end
@@ -7,9 +7,8 @@ class Oscar
7
7
  def complain
8
8
  if destroy_after_save?
9
9
  destroy
10
- true
11
10
  else
12
- false
11
+ throw(:abort)
13
12
  end
14
13
  end
15
14
  end
@@ -3,7 +3,7 @@ class Page
3
3
  embedded_in :quiz
4
4
  embeds_many :page_questions
5
5
 
6
- embedded_in :book
6
+ embedded_in :book, touch: true
7
7
  embeds_many :notes
8
8
  field :content, :type => String
9
9
 
@@ -36,6 +36,7 @@ class Person
36
36
  field :overridden_setter, type: String
37
37
  field :arrays, type: Array
38
38
  field :range, type: Range
39
+ field :species, type: Symbol
39
40
 
40
41
  index age: 1
41
42
  index addresses: 1
@@ -43,8 +44,6 @@ class Person
43
44
  index name: 1
44
45
  index title: 1
45
46
 
46
- index({ ssn: 1 }, { unique: true })
47
-
48
47
  attr_reader :rescored
49
48
 
50
49
  embeds_many :favorites, order: :title.desc, inverse_of: :perp, validate: false
@@ -134,7 +133,8 @@ class Person
134
133
  self.score_without_rescoring = score
135
134
  end
136
135
 
137
- alias_method_chain :score=, :rescoring
136
+ alias_method :score_without_rescoring=, :score=
137
+ alias_method :score=, :score_with_rescoring=
138
138
 
139
139
  def update_addresses
140
140
  addresses.each do |address|
@@ -1,8 +1,10 @@
1
1
  class Princess
2
2
  include Mongoid::Document
3
3
  field :primary_color
4
+ field :name, type: String
4
5
  def color
5
6
  primary_color.to_s
6
7
  end
7
8
  validates_presence_of :color
9
+ validates :name, presence: true, on: :update
8
10
  end
@@ -1,6 +1,7 @@
1
1
  class Record
2
2
  include Mongoid::Document
3
3
  field :name, type: String
4
+ field :producers, type: Array
4
5
 
5
6
  field :before_create_called, type: Mongoid::Boolean, default: false
6
7
  field :before_save_called, type: Mongoid::Boolean, default: false
@@ -1,4 +1,5 @@
1
1
  class Subscription
2
2
  include Mongoid::Document
3
3
  has_many :packs, class_name: "ShippingPack"
4
+ field :packs_count, type: Integer
4
5
  end
@@ -4,6 +4,6 @@ class Thing
4
4
  embedded_in :actor
5
5
 
6
6
  def dont_do_it
7
- false
7
+ throw(:abort)
8
8
  end
9
9
  end
@@ -17,6 +17,10 @@ test:
17
17
  database: reports
18
18
  hosts:
19
19
  - <%=ENV["MONGOID_SPEC_HOST"]%>:<%=ENV["MONGOID_SPEC_PORT"]%>
20
+ options:
21
+ user: "mongoid-user"
22
+ password: "password"
23
+ auth_source: "admin"
20
24
  options:
21
25
  include_root_in_json: false
22
26
  include_type_for_serialization: false
@@ -26,4 +30,15 @@ test:
26
30
  use_activesupport_time_zone: true
27
31
  use_utc: false
28
32
  log_level: :warn
33
+ belongs_to_required_by_default: false
29
34
  app_name: 'testing'
35
+ test_with_max_staleness:
36
+ clients:
37
+ default:
38
+ database: mongoid_test
39
+ hosts:
40
+ - <%=ENV["MONGOID_SPEC_HOST"]%>:<%=ENV["MONGOID_SPEC_PORT"]%>
41
+ options:
42
+ read:
43
+ mode: :primary_preferred
44
+ max_staleness: 100
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'spec_helper'
5
+
6
+ describe Mongoid::Document do
7
+ context 'when including class uses delegate' do
8
+ let(:patient) do
9
+ DelegatingPatient.new(
10
+ email: Email.new(address: 'test@example.com'),
11
+ )
12
+ end
13
+
14
+ it 'works for instance level delegation' do
15
+ patient.address.should == 'test@example.com'
16
+ end
17
+
18
+ it 'works for class level delegation' do
19
+ DelegatingPatient.default_client.should be Mongoid.default_client
20
+ end
21
+ end
22
+ end
@@ -212,7 +212,7 @@ describe Mongoid::Atomic::Modifiers do
212
212
  it "adds the push all modifiers" do
213
213
  expect(modifiers).to eq(
214
214
  { "$push" =>
215
- { "addresses" => { '$each' => [
215
+ { "addresses" => { '$each' => [
216
216
  { "street" => "Oxford St" }
217
217
  ] }
218
218
  }
@@ -300,7 +300,7 @@ describe Mongoid::Atomic::Modifiers do
300
300
  expect(modifiers).to eq(
301
301
  { "$pullAll" => {
302
302
  "addresses" => { "street" => "Bond St" }},
303
- conflicts: { "$push" =>
303
+ conflicts: { "$push" =>
304
304
  { "addresses" => { '$each' => [
305
305
  { "street" => "Oxford St" }
306
306
  ] }
@@ -329,7 +329,7 @@ describe Mongoid::Atomic::Modifiers do
329
329
  it "adds the push all modifiers to the conflicts hash" do
330
330
  expect(modifiers).to eq(
331
331
  { "$push" => {
332
- "addresses.0.locations" => {'$each' => [{ "street" => "Bond St" }]}},
332
+ "addresses.0.locations" => { '$each' => [{ "street" => "Bond St" }] } },
333
333
  conflicts: { "$push" =>
334
334
  { "addresses" => { '$each' => [
335
335
  { "street" => "Oxford St" }
@@ -76,13 +76,13 @@ describe Mongoid::Atomic do
76
76
  person.addresses.build(street: "Oxford St")
77
77
  end
78
78
 
79
- it "returns a $set and $push and $each for modifications" do
79
+ it "returns a $set and $push for modifications" do
80
80
  expect(person.atomic_updates).to eq(
81
81
  {
82
82
  "$set" => { "title" => "Sir" },
83
- "$push" => { "addresses" => {'$each' => [
83
+ "$push" => { "addresses" => { '$each' => [
84
84
  { "_id" => "oxford-st", "street" => "Oxford St" }
85
- ] } }
85
+ ]} }
86
86
  }
87
87
  )
88
88
  end
@@ -339,14 +339,14 @@ describe Mongoid::Atomic do
339
339
  address.locations.build(name: "Home")
340
340
  end
341
341
 
342
- it "returns the proper $sets and $pushs and $eaches for all levels" do
342
+ it "returns the proper $sets and $pushes for all levels" do
343
343
  expect(person.atomic_updates).to eq(
344
344
  {
345
345
  "$set" => {
346
346
  "title" => "Sir",
347
347
  },
348
348
  "$push" => {
349
- "addresses" => { "$each" => [{
349
+ "addresses" => { '$each' => [{
350
350
  "_id" => address.id,
351
351
  "street" => "Another",
352
352
  "locations" => [
@@ -205,6 +205,10 @@ describe Mongoid::Attributes::Nested do
205
205
  Post.accepts_nested_attributes_for :person
206
206
  end
207
207
 
208
+ after do
209
+ Post.reset_callbacks(:save)
210
+ end
211
+
208
212
  let(:post) do
209
213
  Post.new(person_attributes: { title: "Sir" })
210
214
  end
@@ -1335,7 +1339,7 @@ describe Mongoid::Attributes::Nested do
1335
1339
  expect {
1336
1340
  person.addresses_attributes =
1337
1341
  { "foo" => { "id" => "test", "street" => "Test" } }
1338
- }.to raise_error
1342
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
1339
1343
  end
1340
1344
  end
1341
1345
  end
@@ -1434,7 +1438,7 @@ describe Mongoid::Attributes::Nested do
1434
1438
  Person.create(age: 42)
1435
1439
  end
1436
1440
 
1437
- context "when the child returns false in a before callback" do
1441
+ context "when the child halts the callback chain in a before callback" do
1438
1442
 
1439
1443
  context "when the child is not paranoid" do
1440
1444
 
@@ -1970,7 +1974,7 @@ describe Mongoid::Attributes::Nested do
1970
1974
  }
1971
1975
  end
1972
1976
 
1973
- it "ignores the the marked document" do
1977
+ it "ignores the marked document" do
1974
1978
  expect(person.addresses.size).to eq(1)
1975
1979
  end
1976
1980
 
@@ -2031,7 +2035,7 @@ describe Mongoid::Attributes::Nested do
2031
2035
  }
2032
2036
  end
2033
2037
 
2034
- it "adds the the marked document" do
2038
+ it "adds the marked document" do
2035
2039
  expect(person.addresses.first.street).to eq("Maybachufer")
2036
2040
  end
2037
2041
 
@@ -2091,7 +2095,7 @@ describe Mongoid::Attributes::Nested do
2091
2095
  }
2092
2096
  end
2093
2097
 
2094
- it "adds the the marked document" do
2098
+ it "adds the marked document" do
2095
2099
  expect(person.addresses.first.street).to eq("Maybachufer")
2096
2100
  end
2097
2101
 
@@ -3028,7 +3032,7 @@ describe Mongoid::Attributes::Nested do
3028
3032
  expect {
3029
3033
  person.posts_attributes =
3030
3034
  { "foo" => { "id" => "test", "title" => "Test" } }
3031
- }.to raise_error
3035
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
3032
3036
  end
3033
3037
  end
3034
3038
  end
@@ -3431,7 +3435,7 @@ describe Mongoid::Attributes::Nested do
3431
3435
  }
3432
3436
  end
3433
3437
 
3434
- it "ignores the the marked document" do
3438
+ it "ignores the marked document" do
3435
3439
  expect(person.posts.size).to eq(1)
3436
3440
  end
3437
3441
 
@@ -3492,7 +3496,7 @@ describe Mongoid::Attributes::Nested do
3492
3496
  }
3493
3497
  end
3494
3498
 
3495
- it "adds the the marked document" do
3499
+ it "adds the marked document" do
3496
3500
  expect(person.posts.first.title).to eq("New Blog")
3497
3501
  end
3498
3502
 
@@ -3552,7 +3556,7 @@ describe Mongoid::Attributes::Nested do
3552
3556
  }
3553
3557
  end
3554
3558
 
3555
- it "adds the the marked document" do
3559
+ it "adds the marked document" do
3556
3560
  expect(person.posts.first.title).to eq("New Blog")
3557
3561
  end
3558
3562
 
@@ -3745,7 +3749,7 @@ describe Mongoid::Attributes::Nested do
3745
3749
  expect {
3746
3750
  person.preferences_attributes =
3747
3751
  { "foo" => { "id" => "test", "name" => "Test" } }
3748
- }.to raise_error
3752
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
3749
3753
  end
3750
3754
  end
3751
3755
  end
@@ -4097,7 +4101,7 @@ describe Mongoid::Attributes::Nested do
4097
4101
  }
4098
4102
  end
4099
4103
 
4100
- it "ignores the the marked document" do
4104
+ it "ignores the marked document" do
4101
4105
  expect(person.preferences.size).to eq(1)
4102
4106
  end
4103
4107
 
@@ -4158,7 +4162,7 @@ describe Mongoid::Attributes::Nested do
4158
4162
  }
4159
4163
  end
4160
4164
 
4161
- it "adds the the marked document" do
4165
+ it "adds the marked document" do
4162
4166
  expect(person.preferences.first.name).to eq("New Blog")
4163
4167
  end
4164
4168
 
@@ -4218,7 +4222,7 @@ describe Mongoid::Attributes::Nested do
4218
4222
  }
4219
4223
  end
4220
4224
 
4221
- it "adds the the marked document" do
4225
+ it "adds the marked document" do
4222
4226
  expect(person.preferences.first.name).to eq("New Blog")
4223
4227
  end
4224
4228
 
@@ -4852,7 +4856,7 @@ describe Mongoid::Attributes::Nested do
4852
4856
  end
4853
4857
 
4854
4858
  it "the update raises an error" do
4855
- expect{ error_raising_update }.to raise_error
4859
+ expect{ error_raising_update }.to raise_error(Mongoid::Errors::Validations)
4856
4860
  end
4857
4861
 
4858
4862
  it "the update does not occur" do