mongoid 6.4.4 → 7.3.2

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 (1341) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +13 -13
  4. data/LICENSE +1 -0
  5. data/README.md +34 -20
  6. data/Rakefile +75 -5
  7. data/lib/config/locales/en.yml +115 -53
  8. data/lib/mongoid/association/accessors.rb +429 -0
  9. data/lib/mongoid/association/bindable.rb +200 -0
  10. data/lib/mongoid/association/builders.rb +93 -0
  11. data/lib/mongoid/association/constrainable.rb +46 -0
  12. data/lib/mongoid/association/depending.rb +135 -0
  13. data/lib/mongoid/association/eager_loadable.rb +38 -0
  14. data/lib/mongoid/association/embedded/batchable.rb +386 -0
  15. data/lib/mongoid/association/embedded/cyclic.rb +111 -0
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +59 -0
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +41 -0
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +124 -0
  19. data/lib/mongoid/association/embedded/embedded_in.rb +157 -0
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +48 -0
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +48 -0
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +562 -0
  23. data/lib/mongoid/association/embedded/embeds_many.rb +214 -0
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +50 -0
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +42 -0
  26. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +133 -0
  27. data/lib/mongoid/association/embedded/embeds_one.rb +177 -0
  28. data/lib/mongoid/association/embedded.rb +7 -0
  29. data/lib/mongoid/association/macros.rb +206 -0
  30. data/lib/mongoid/association/many.rb +215 -0
  31. data/lib/mongoid/association/marshalable.rb +36 -0
  32. data/lib/mongoid/association/nested/many.rb +202 -0
  33. data/lib/mongoid/association/nested/nested_buildable.rb +75 -0
  34. data/lib/mongoid/association/nested/one.rb +131 -0
  35. data/lib/mongoid/association/nested.rb +18 -0
  36. data/lib/mongoid/association/one.rb +62 -0
  37. data/lib/mongoid/association/options.rb +155 -0
  38. data/lib/mongoid/association/proxy.rb +210 -0
  39. data/lib/mongoid/association/referenced/auto_save.rb +82 -0
  40. data/lib/mongoid/association/referenced/belongs_to/binding.rb +89 -0
  41. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +49 -0
  42. data/lib/mongoid/association/referenced/belongs_to/eager.rb +74 -0
  43. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +138 -0
  44. data/lib/mongoid/association/referenced/belongs_to.rb +251 -0
  45. data/lib/mongoid/association/referenced/counter_cache.rb +165 -0
  46. data/lib/mongoid/association/referenced/eager.rb +184 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +77 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +43 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +54 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +319 -0
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +297 -0
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +41 -0
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +41 -0
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +45 -0
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +550 -0
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +588 -0
  57. data/lib/mongoid/association/referenced/has_many.rb +278 -0
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +49 -0
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +75 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +37 -0
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +128 -0
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +120 -0
  63. data/lib/mongoid/association/referenced/has_one.rb +207 -0
  64. data/lib/mongoid/association/referenced/syncable.rb +172 -0
  65. data/lib/mongoid/association/referenced.rb +10 -0
  66. data/lib/mongoid/association/reflections.rb +70 -0
  67. data/lib/mongoid/association/relatable.rb +514 -0
  68. data/lib/mongoid/association.rb +152 -0
  69. data/lib/mongoid/atomic/modifiers.rb +25 -2
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +5 -3
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -3
  72. data/lib/mongoid/atomic/paths/embedded.rb +3 -1
  73. data/lib/mongoid/atomic/paths/root.rb +4 -2
  74. data/lib/mongoid/atomic/paths.rb +2 -0
  75. data/lib/mongoid/atomic.rb +16 -4
  76. data/lib/mongoid/attributes/dynamic.rb +19 -16
  77. data/lib/mongoid/attributes/nested.rb +29 -16
  78. data/lib/mongoid/attributes/processing.rb +10 -8
  79. data/lib/mongoid/attributes/projector.rb +120 -0
  80. data/lib/mongoid/attributes/readonly.rb +5 -5
  81. data/lib/mongoid/attributes.rb +93 -57
  82. data/lib/mongoid/cacheable.rb +5 -3
  83. data/lib/mongoid/changeable.rb +4 -2
  84. data/lib/mongoid/clients/factory.rb +42 -10
  85. data/lib/mongoid/clients/options.rb +17 -13
  86. data/lib/mongoid/clients/sessions.rb +23 -4
  87. data/lib/mongoid/clients/storage_options.rb +7 -5
  88. data/lib/mongoid/clients/validators/storage.rb +2 -0
  89. data/lib/mongoid/clients/validators.rb +2 -0
  90. data/lib/mongoid/clients.rb +3 -1
  91. data/lib/mongoid/composable.rb +9 -6
  92. data/lib/mongoid/config/environment.rb +23 -8
  93. data/lib/mongoid/config/options.rb +20 -12
  94. data/lib/mongoid/config/validators/client.rb +2 -0
  95. data/lib/mongoid/config/validators/option.rb +2 -0
  96. data/lib/mongoid/config/validators.rb +2 -0
  97. data/lib/mongoid/config.rb +75 -11
  98. data/lib/mongoid/contextual/aggregable/memory.rb +3 -1
  99. data/lib/mongoid/contextual/aggregable/mongo.rb +13 -9
  100. data/lib/mongoid/contextual/atomic.rb +24 -6
  101. data/lib/mongoid/contextual/command.rb +2 -0
  102. data/lib/mongoid/contextual/geo_near.rb +6 -4
  103. data/lib/mongoid/contextual/map_reduce.rb +5 -2
  104. data/lib/mongoid/contextual/memory.rb +23 -3
  105. data/lib/mongoid/contextual/mongo.rb +39 -13
  106. data/lib/mongoid/contextual/none.rb +2 -0
  107. data/lib/mongoid/contextual/queryable.rb +2 -0
  108. data/lib/mongoid/contextual.rb +7 -4
  109. data/lib/mongoid/copyable.rb +20 -9
  110. data/lib/mongoid/criteria/findable.rb +12 -2
  111. data/lib/mongoid/criteria/includable.rb +21 -19
  112. data/lib/mongoid/criteria/inspectable.rb +2 -0
  113. data/lib/mongoid/criteria/marshalable.rb +2 -0
  114. data/lib/mongoid/criteria/modifiable.rb +10 -3
  115. data/lib/mongoid/criteria/options.rb +4 -2
  116. data/lib/mongoid/criteria/permission.rb +2 -0
  117. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -0
  118. data/lib/mongoid/criteria/queryable/expandable.rb +69 -0
  119. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -1
  120. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -1
  121. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -1
  122. data/lib/mongoid/criteria/queryable/extensions/date.rb +3 -1
  123. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +5 -6
  124. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -1
  125. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -1
  126. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -2
  127. data/lib/mongoid/criteria/queryable/extensions/object.rb +3 -1
  128. data/lib/mongoid/criteria/queryable/extensions/range.rb +3 -1
  129. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -7
  130. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -1
  131. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -2
  132. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  133. data/lib/mongoid/criteria/queryable/extensions/time.rb +4 -2
  134. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +15 -1
  135. data/lib/mongoid/criteria/queryable/extensions.rb +1 -3
  136. data/lib/mongoid/criteria/queryable/key.rb +101 -14
  137. data/lib/mongoid/criteria/queryable/macroable.rb +3 -1
  138. data/lib/mongoid/criteria/queryable/mergeable.rb +184 -15
  139. data/lib/mongoid/criteria/queryable/optional.rb +5 -3
  140. data/lib/mongoid/criteria/queryable/options.rb +2 -0
  141. data/lib/mongoid/criteria/queryable/pipeline.rb +14 -6
  142. data/lib/mongoid/criteria/queryable/selectable.rb +399 -98
  143. data/lib/mongoid/criteria/queryable/selector.rb +46 -39
  144. data/lib/mongoid/criteria/queryable/smash.rb +2 -0
  145. data/lib/mongoid/criteria/queryable/storable.rb +233 -0
  146. data/lib/mongoid/criteria/queryable.rb +7 -2
  147. data/lib/mongoid/criteria/scopable.rb +2 -0
  148. data/lib/mongoid/criteria.rb +88 -18
  149. data/lib/mongoid/document.rb +32 -22
  150. data/lib/mongoid/equality.rb +3 -2
  151. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -2
  152. data/lib/mongoid/errors/callback.rb +2 -0
  153. data/lib/mongoid/errors/criteria_argument_required.rb +19 -0
  154. data/lib/mongoid/errors/delete_restriction.rb +10 -10
  155. data/lib/mongoid/errors/document_not_destroyed.rb +2 -0
  156. data/lib/mongoid/errors/document_not_found.rb +2 -0
  157. data/lib/mongoid/errors/eager_load.rb +6 -2
  158. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -0
  159. data/lib/mongoid/errors/invalid_collection.rb +2 -0
  160. data/lib/mongoid/errors/invalid_config_option.rb +2 -0
  161. data/lib/mongoid/errors/invalid_dependent_strategy.rb +34 -0
  162. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  163. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  164. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  165. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  166. data/lib/mongoid/errors/invalid_field.rb +2 -0
  167. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  168. data/lib/mongoid/errors/invalid_field_option.rb +2 -0
  169. data/lib/mongoid/errors/invalid_find.rb +2 -0
  170. data/lib/mongoid/errors/invalid_includes.rb +2 -0
  171. data/lib/mongoid/errors/invalid_index.rb +2 -0
  172. data/lib/mongoid/errors/invalid_options.rb +4 -2
  173. data/lib/mongoid/errors/invalid_path.rb +2 -0
  174. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -0
  175. data/lib/mongoid/errors/invalid_query.rb +41 -0
  176. data/lib/mongoid/errors/invalid_relation.rb +4 -2
  177. data/lib/mongoid/errors/invalid_relation_option.rb +31 -0
  178. data/lib/mongoid/errors/invalid_scope.rb +2 -0
  179. data/lib/mongoid/errors/invalid_session_use.rb +2 -0
  180. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -4
  181. data/lib/mongoid/errors/invalid_storage_options.rb +2 -0
  182. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  183. data/lib/mongoid/errors/invalid_time.rb +2 -0
  184. data/lib/mongoid/errors/invalid_value.rb +2 -0
  185. data/lib/mongoid/errors/inverse_not_found.rb +3 -1
  186. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -0
  187. data/lib/mongoid/errors/mixed_relations.rb +2 -0
  188. data/lib/mongoid/errors/mongoid_error.rb +3 -1
  189. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -1
  190. data/lib/mongoid/errors/no_client_config.rb +4 -2
  191. data/lib/mongoid/errors/no_client_database.rb +2 -0
  192. data/lib/mongoid/errors/no_client_hosts.rb +2 -0
  193. data/lib/mongoid/errors/no_clients_config.rb +2 -0
  194. data/lib/mongoid/errors/no_default_client.rb +3 -1
  195. data/lib/mongoid/errors/no_environment.rb +2 -0
  196. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -0
  197. data/lib/mongoid/errors/no_metadata.rb +2 -0
  198. data/lib/mongoid/errors/no_parent.rb +2 -0
  199. data/lib/mongoid/errors/readonly_attribute.rb +2 -0
  200. data/lib/mongoid/errors/readonly_document.rb +2 -0
  201. data/lib/mongoid/errors/scope_overwrite.rb +2 -0
  202. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -0
  203. data/lib/mongoid/errors/unknown_attribute.rb +2 -0
  204. data/lib/mongoid/errors/unknown_model.rb +27 -0
  205. data/lib/mongoid/errors/unsaved_document.rb +2 -0
  206. data/lib/mongoid/errors/unsupported_javascript.rb +2 -0
  207. data/lib/mongoid/errors/validations.rb +2 -0
  208. data/lib/mongoid/errors.rb +13 -0
  209. data/lib/mongoid/evolvable.rb +4 -2
  210. data/lib/mongoid/extensions/array.rb +28 -11
  211. data/lib/mongoid/extensions/big_decimal.rb +2 -0
  212. data/lib/mongoid/extensions/boolean.rb +3 -2
  213. data/lib/mongoid/extensions/date.rb +13 -3
  214. data/lib/mongoid/extensions/date_time.rb +4 -3
  215. data/lib/mongoid/extensions/decimal128.rb +2 -0
  216. data/lib/mongoid/extensions/false_class.rb +3 -1
  217. data/lib/mongoid/extensions/float.rb +5 -3
  218. data/lib/mongoid/extensions/hash.rb +58 -13
  219. data/lib/mongoid/extensions/integer.rb +5 -3
  220. data/lib/mongoid/extensions/module.rb +2 -0
  221. data/lib/mongoid/extensions/nil_class.rb +2 -0
  222. data/lib/mongoid/extensions/object.rb +20 -8
  223. data/lib/mongoid/extensions/object_id.rb +2 -0
  224. data/lib/mongoid/extensions/range.rb +3 -0
  225. data/lib/mongoid/extensions/regexp.rb +3 -1
  226. data/lib/mongoid/extensions/set.rb +2 -0
  227. data/lib/mongoid/extensions/string.rb +23 -12
  228. data/lib/mongoid/extensions/symbol.rb +2 -0
  229. data/lib/mongoid/extensions/time.rb +14 -0
  230. data/lib/mongoid/extensions/time_with_zone.rb +14 -0
  231. data/lib/mongoid/extensions/true_class.rb +3 -1
  232. data/lib/mongoid/extensions.rb +3 -4
  233. data/lib/mongoid/factory.rb +59 -9
  234. data/lib/mongoid/fields/foreign_key.rb +8 -6
  235. data/lib/mongoid/fields/localized.rb +2 -0
  236. data/lib/mongoid/fields/standard.rb +8 -17
  237. data/lib/mongoid/fields/validators/macro.rb +39 -12
  238. data/lib/mongoid/fields/validators.rb +2 -0
  239. data/lib/mongoid/fields.rb +54 -10
  240. data/lib/mongoid/findable.rb +59 -18
  241. data/lib/mongoid/indexable/specification.rb +3 -1
  242. data/lib/mongoid/indexable/validators/options.rb +2 -0
  243. data/lib/mongoid/indexable.rb +9 -4
  244. data/lib/mongoid/inspectable.rb +4 -2
  245. data/lib/mongoid/interceptable.rb +18 -10
  246. data/lib/mongoid/loggable.rb +13 -7
  247. data/lib/mongoid/matchable.rb +3 -148
  248. data/lib/mongoid/matcher/all.rb +22 -0
  249. data/lib/mongoid/matcher/and.rb +21 -0
  250. data/lib/mongoid/matcher/bits.rb +41 -0
  251. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  252. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  253. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  254. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  255. data/lib/mongoid/matcher/elem_match.rb +36 -0
  256. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  257. data/lib/mongoid/matcher/eq.rb +11 -0
  258. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  259. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  260. data/lib/mongoid/matcher/exists.rb +15 -0
  261. data/lib/mongoid/matcher/expression.rb +35 -0
  262. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  263. data/lib/mongoid/matcher/field_expression.rb +62 -0
  264. data/lib/mongoid/matcher/field_operator.rb +54 -0
  265. data/lib/mongoid/matcher/gt.rb +17 -0
  266. data/lib/mongoid/matcher/gte.rb +17 -0
  267. data/lib/mongoid/matcher/in.rb +25 -0
  268. data/lib/mongoid/matcher/lt.rb +17 -0
  269. data/lib/mongoid/matcher/lte.rb +17 -0
  270. data/lib/mongoid/matcher/mod.rb +17 -0
  271. data/lib/mongoid/matcher/ne.rb +16 -0
  272. data/lib/mongoid/matcher/nin.rb +11 -0
  273. data/lib/mongoid/matcher/nor.rb +25 -0
  274. data/lib/mongoid/matcher/not.rb +29 -0
  275. data/lib/mongoid/matcher/or.rb +21 -0
  276. data/lib/mongoid/matcher/regex.rb +41 -0
  277. data/lib/mongoid/matcher/size.rb +26 -0
  278. data/lib/mongoid/matcher/type.rb +99 -0
  279. data/lib/mongoid/matcher.rb +110 -0
  280. data/lib/mongoid/persistable/creatable.rb +3 -1
  281. data/lib/mongoid/persistable/deletable.rb +11 -9
  282. data/lib/mongoid/persistable/destroyable.rb +11 -3
  283. data/lib/mongoid/persistable/incrementable.rb +7 -3
  284. data/lib/mongoid/persistable/logical.rb +5 -2
  285. data/lib/mongoid/persistable/poppable.rb +3 -1
  286. data/lib/mongoid/persistable/pullable.rb +3 -1
  287. data/lib/mongoid/persistable/pushable.rb +14 -3
  288. data/lib/mongoid/persistable/renamable.rb +10 -3
  289. data/lib/mongoid/persistable/savable.rb +3 -1
  290. data/lib/mongoid/persistable/settable.rb +60 -13
  291. data/lib/mongoid/persistable/unsettable.rb +8 -3
  292. data/lib/mongoid/persistable/updatable.rb +30 -3
  293. data/lib/mongoid/persistable/upsertable.rb +3 -1
  294. data/lib/mongoid/persistable.rb +136 -19
  295. data/lib/mongoid/persistence_context.rb +47 -20
  296. data/lib/mongoid/positional.rb +3 -1
  297. data/lib/mongoid/query_cache.rb +132 -77
  298. data/lib/mongoid/railtie.rb +3 -1
  299. data/lib/mongoid/railties/controller_runtime.rb +4 -1
  300. data/lib/mongoid/railties/database.rake +9 -0
  301. data/lib/mongoid/reloadable.rb +11 -4
  302. data/lib/mongoid/scopable.rb +2 -1
  303. data/lib/mongoid/selectable.rb +8 -8
  304. data/lib/mongoid/serializable.rb +28 -18
  305. data/lib/mongoid/shardable.rb +80 -10
  306. data/lib/mongoid/stateful.rb +3 -1
  307. data/lib/mongoid/stringified_symbol.rb +53 -0
  308. data/lib/mongoid/tasks/database.rake +12 -5
  309. data/lib/mongoid/tasks/database.rb +85 -0
  310. data/lib/mongoid/threaded/lifecycle.rb +2 -0
  311. data/lib/mongoid/threaded.rb +2 -0
  312. data/lib/mongoid/timestamps/created/short.rb +2 -0
  313. data/lib/mongoid/timestamps/created.rb +3 -1
  314. data/lib/mongoid/timestamps/short.rb +2 -0
  315. data/lib/mongoid/timestamps/timeless.rb +6 -2
  316. data/lib/mongoid/timestamps/updated/short.rb +2 -0
  317. data/lib/mongoid/timestamps/updated.rb +3 -1
  318. data/lib/mongoid/timestamps.rb +3 -1
  319. data/lib/mongoid/touchable.rb +129 -0
  320. data/lib/mongoid/traversable.rb +118 -9
  321. data/lib/mongoid/validatable/associated.rb +5 -3
  322. data/lib/mongoid/validatable/format.rb +2 -0
  323. data/lib/mongoid/validatable/length.rb +2 -0
  324. data/lib/mongoid/validatable/localizable.rb +2 -0
  325. data/lib/mongoid/validatable/macros.rb +3 -1
  326. data/lib/mongoid/validatable/presence.rb +9 -7
  327. data/lib/mongoid/validatable/queryable.rb +2 -0
  328. data/lib/mongoid/validatable/uniqueness.rb +10 -8
  329. data/lib/mongoid/validatable.rb +15 -13
  330. data/lib/mongoid/version.rb +3 -1
  331. data/lib/mongoid.rb +35 -2
  332. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -1
  333. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +45 -27
  334. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -1
  335. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  336. data/lib/rails/generators/mongoid_generator.rb +2 -0
  337. data/lib/rails/mongoid.rb +4 -2
  338. data/lib/support/ruby_version.rb +3 -0
  339. data/spec/README.md +33 -0
  340. data/spec/config/mongoid.yml +14 -3
  341. data/spec/integration/app_spec.rb +344 -0
  342. data/spec/integration/associations/belongs_to_spec.rb +16 -0
  343. data/spec/integration/associations/embedded_spec.rb +269 -0
  344. data/spec/integration/associations/embeds_many_spec.rb +68 -0
  345. data/spec/integration/associations/embeds_one_spec.rb +24 -0
  346. data/spec/integration/associations/foreign_key_spec.rb +99 -0
  347. data/spec/integration/associations/foreign_key_spec_models.rb +65 -0
  348. data/spec/integration/associations/has_many_spec.rb +129 -0
  349. data/spec/integration/associations/has_one_spec.rb +177 -0
  350. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  351. data/spec/integration/associations/reverse_population_spec.rb +35 -0
  352. data/spec/integration/associations/reverse_population_spec_models.rb +37 -0
  353. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  354. data/spec/integration/bson_regexp_raw_spec.rb +20 -0
  355. data/spec/integration/callbacks_models.rb +49 -0
  356. data/spec/integration/callbacks_spec.rb +216 -0
  357. data/spec/integration/criteria/date_field_spec.rb +41 -0
  358. data/spec/integration/criteria/default_scope_spec.rb +21 -0
  359. data/spec/integration/criteria/logical_spec.rb +94 -0
  360. data/spec/integration/criteria/time_with_zone_spec.rb +32 -0
  361. data/spec/integration/discriminator_key_spec.rb +354 -0
  362. data/spec/integration/discriminator_value_spec.rb +207 -0
  363. data/spec/integration/document_spec.rb +52 -0
  364. data/spec/integration/i18n_fallbacks_spec.rb +90 -0
  365. data/spec/integration/matcher_examples_spec.rb +759 -0
  366. data/spec/integration/matcher_operator_data/all.yml +140 -0
  367. data/spec/integration/matcher_operator_data/and.yml +93 -0
  368. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  369. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  370. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  371. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  372. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  373. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  374. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  375. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  376. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  377. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  378. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  379. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  380. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  381. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  382. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  383. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  384. data/spec/integration/matcher_operator_data/in.yml +210 -0
  385. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  386. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  387. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  388. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  389. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  390. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  391. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  392. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  393. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  394. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  395. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  396. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  397. data/spec/integration/matcher_operator_data/not.yml +196 -0
  398. data/spec/integration/matcher_operator_data/or.yml +137 -0
  399. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  400. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  401. data/spec/integration/matcher_operator_data/size.yml +174 -0
  402. data/spec/integration/matcher_operator_data/type.yml +70 -0
  403. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  404. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  405. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  406. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  407. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  408. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  409. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  410. data/spec/integration/matcher_operator_data/type_decimal.yml +40 -0
  411. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  412. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  413. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  414. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  415. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  416. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  417. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  418. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  419. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  420. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  421. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  422. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  423. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  424. data/spec/integration/matcher_operator_spec.rb +100 -0
  425. data/spec/integration/matcher_spec.rb +189 -0
  426. data/spec/integration/server_query_spec.rb +142 -0
  427. data/spec/integration/shardable_spec.rb +149 -0
  428. data/spec/integration/stringified_symbol_field_spec.rb +190 -0
  429. data/spec/lite_spec_helper.rb +77 -0
  430. data/spec/mongoid/association/accessors_spec.rb +1038 -0
  431. data/spec/mongoid/association/auto_save_spec.rb +365 -0
  432. data/spec/mongoid/association/builders_spec.rb +256 -0
  433. data/spec/mongoid/association/constrainable_spec.rb +118 -0
  434. data/spec/mongoid/association/counter_cache_spec.rb +453 -0
  435. data/spec/mongoid/association/depending_spec.rb +960 -0
  436. data/spec/mongoid/association/eager_spec.rb +282 -0
  437. data/spec/mongoid/association/embedded/cyclic_spec.rb +181 -0
  438. data/spec/mongoid/association/embedded/dirty_spec.rb +68 -0
  439. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +174 -0
  440. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +37 -0
  441. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +560 -0
  442. data/spec/mongoid/association/embedded/embedded_in_spec.rb +904 -0
  443. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +57 -0
  444. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +107 -0
  445. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +4403 -0
  446. data/spec/mongoid/association/embedded/embeds_many_models.rb +54 -0
  447. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +52 -0
  448. data/spec/mongoid/association/embedded/embeds_many_spec.rb +865 -0
  449. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +80 -0
  450. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +82 -0
  451. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1026 -0
  452. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +9 -0
  453. data/spec/mongoid/association/embedded/embeds_one_models.rb +55 -0
  454. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +29 -0
  455. data/spec/mongoid/association/embedded/embeds_one_spec.rb +957 -0
  456. data/spec/mongoid/association/macros_spec.rb +1117 -0
  457. data/spec/mongoid/association/nested/many_spec.rb +233 -0
  458. data/spec/mongoid/association/nested/one_spec.rb +254 -0
  459. data/spec/mongoid/association/options_spec.rb +1324 -0
  460. data/spec/mongoid/association/polymorphic_spec.rb +163 -0
  461. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +244 -0
  462. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +200 -0
  463. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +377 -0
  464. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1369 -0
  465. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +38 -0
  466. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2026 -0
  467. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +181 -0
  468. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +124 -0
  469. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +168 -0
  470. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +77 -0
  471. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +3748 -0
  472. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +50 -0
  473. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +40 -0
  474. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1051 -0
  475. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +156 -0
  476. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +122 -0
  477. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +274 -0
  478. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2054 -0
  479. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +24 -0
  480. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +4029 -0
  481. data/spec/mongoid/association/referenced/has_many_models.rb +61 -0
  482. data/spec/mongoid/association/referenced/has_many_query_spec.rb +38 -0
  483. data/spec/mongoid/association/referenced/has_many_spec.rb +1228 -0
  484. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +134 -0
  485. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +116 -0
  486. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +178 -0
  487. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1143 -0
  488. data/spec/mongoid/association/referenced/has_one_models.rb +80 -0
  489. data/spec/mongoid/association/referenced/has_one_query_spec.rb +38 -0
  490. data/spec/mongoid/association/referenced/has_one_spec.rb +1363 -0
  491. data/spec/mongoid/association/reflections_spec.rb +93 -0
  492. data/spec/mongoid/association/syncable_spec.rb +500 -0
  493. data/spec/mongoid/association_spec.rb +192 -0
  494. data/spec/mongoid/atomic/modifiers_spec.rb +52 -2
  495. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +3 -0
  496. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +3 -0
  497. data/spec/mongoid/atomic/paths/root_spec.rb +3 -0
  498. data/spec/mongoid/atomic/paths_spec.rb +108 -12
  499. data/spec/mongoid/atomic_spec.rb +30 -4
  500. data/spec/mongoid/attributes/dynamic_spec.rb +153 -0
  501. data/spec/mongoid/attributes/nested_spec.rb +33 -12
  502. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  503. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  504. data/spec/mongoid/attributes/projector_spec.rb +41 -0
  505. data/spec/mongoid/attributes/readonly_spec.rb +83 -125
  506. data/spec/mongoid/attributes_spec.rb +393 -9
  507. data/spec/mongoid/cacheable_spec.rb +3 -0
  508. data/spec/mongoid/changeable_spec.rb +26 -0
  509. data/spec/mongoid/clients/factory_spec.rb +142 -33
  510. data/spec/mongoid/clients/options_spec.rb +83 -56
  511. data/spec/mongoid/clients/sessions_spec.rb +19 -8
  512. data/spec/mongoid/clients/transactions_spec.rb +393 -0
  513. data/spec/mongoid/clients_spec.rb +73 -10
  514. data/spec/mongoid/composable_spec.rb +3 -0
  515. data/spec/mongoid/config/environment_spec.rb +3 -0
  516. data/spec/mongoid/config/options_spec.rb +23 -3
  517. data/spec/mongoid/config_spec.rb +126 -1
  518. data/spec/mongoid/contextual/aggregable/memory_spec.rb +3 -0
  519. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +3 -0
  520. data/spec/mongoid/contextual/atomic_spec.rb +137 -14
  521. data/spec/mongoid/contextual/geo_near_spec.rb +15 -2
  522. data/spec/mongoid/contextual/map_reduce_spec.rb +23 -5
  523. data/spec/mongoid/contextual/memory_spec.rb +22 -0
  524. data/spec/mongoid/contextual/mongo_spec.rb +185 -75
  525. data/spec/mongoid/contextual/none_spec.rb +3 -0
  526. data/spec/mongoid/copyable_spec.rb +289 -23
  527. data/spec/mongoid/copyable_spec_models.rb +48 -0
  528. data/spec/mongoid/criteria/findable_spec.rb +58 -0
  529. data/spec/mongoid/criteria/inspectable_spec.rb +3 -0
  530. data/spec/mongoid/criteria/marshalable_spec.rb +3 -0
  531. data/spec/mongoid/criteria/modifiable_spec.rb +181 -5
  532. data/spec/mongoid/criteria/options_spec.rb +3 -0
  533. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -0
  534. data/spec/mongoid/criteria/queryable/expandable_spec.rb +62 -0
  535. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +3 -0
  536. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -0
  537. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +3 -0
  538. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +4 -1
  539. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +3 -0
  540. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +36 -17
  541. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +3 -0
  542. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +3 -0
  543. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +3 -0
  544. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +3 -0
  545. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +3 -0
  546. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +54 -0
  547. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +3 -0
  548. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +3 -0
  549. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +4 -1
  550. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +10 -7
  551. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +3 -0
  552. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +47 -1
  553. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +3 -0
  554. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +43 -23
  555. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +31 -1
  556. data/spec/mongoid/criteria/queryable/key_spec.rb +51 -6
  557. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +146 -12
  558. data/spec/mongoid/criteria/queryable/optional_spec.rb +3 -0
  559. data/spec/mongoid/criteria/queryable/options_spec.rb +3 -0
  560. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +15 -0
  561. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -0
  562. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2070 -0
  563. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
  564. data/spec/mongoid/criteria/queryable/selectable_spec.rb +993 -2937
  565. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
  566. data/spec/mongoid/criteria/queryable/selector_spec.rb +40 -0
  567. data/spec/mongoid/criteria/queryable/smash_spec.rb +3 -0
  568. data/spec/mongoid/criteria/queryable/storable_spec.rb +190 -0
  569. data/spec/mongoid/criteria/scopable_spec.rb +3 -0
  570. data/spec/mongoid/criteria_projection_spec.rb +411 -0
  571. data/spec/mongoid/criteria_spec.rb +280 -297
  572. data/spec/mongoid/document_fields_spec.rb +114 -0
  573. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  574. data/spec/mongoid/document_query_spec.rb +90 -0
  575. data/spec/mongoid/document_spec.rb +121 -19
  576. data/spec/mongoid/equality_spec.rb +3 -1
  577. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +6 -3
  578. data/spec/mongoid/errors/callback_spec.rb +3 -0
  579. data/spec/mongoid/errors/delete_restriction_spec.rb +5 -2
  580. data/spec/mongoid/errors/document_not_destroyed_spec.rb +3 -0
  581. data/spec/mongoid/errors/document_not_found_spec.rb +3 -0
  582. data/spec/mongoid/errors/eager_load_spec.rb +3 -0
  583. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -0
  584. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -0
  585. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -0
  586. data/spec/mongoid/errors/invalid_field_spec.rb +3 -0
  587. data/spec/mongoid/errors/invalid_find_spec.rb +3 -0
  588. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -0
  589. data/spec/mongoid/errors/invalid_index_spec.rb +3 -0
  590. data/spec/mongoid/errors/invalid_options_spec.rb +5 -2
  591. data/spec/mongoid/errors/invalid_path_spec.rb +3 -0
  592. data/spec/mongoid/errors/invalid_relation_spec.rb +5 -2
  593. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -0
  594. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -0
  595. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -0
  596. data/spec/mongoid/errors/invalid_time_spec.rb +3 -0
  597. data/spec/mongoid/errors/inverse_not_found_spec.rb +4 -1
  598. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +3 -0
  599. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -0
  600. data/spec/mongoid/errors/mongoid_error_spec.rb +23 -8
  601. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +6 -3
  602. data/spec/mongoid/errors/no_client_config_spec.rb +5 -2
  603. data/spec/mongoid/errors/no_client_database_spec.rb +6 -3
  604. data/spec/mongoid/errors/no_client_hosts_spec.rb +6 -3
  605. data/spec/mongoid/errors/no_clients_config_spec.rb +3 -0
  606. data/spec/mongoid/errors/no_environment_spec.rb +3 -0
  607. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -0
  608. data/spec/mongoid/errors/no_metadata_spec.rb +5 -2
  609. data/spec/mongoid/errors/no_parent_spec.rb +4 -1
  610. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -0
  611. data/spec/mongoid/errors/readonly_document_spec.rb +3 -0
  612. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -0
  613. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -0
  614. data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -0
  615. data/spec/mongoid/errors/unsaved_document_spec.rb +4 -1
  616. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -0
  617. data/spec/mongoid/errors/validations_spec.rb +3 -0
  618. data/spec/mongoid/extensions/array_spec.rb +37 -58
  619. data/spec/mongoid/extensions/big_decimal_spec.rb +3 -0
  620. data/spec/mongoid/extensions/binary_spec.rb +3 -0
  621. data/spec/mongoid/extensions/boolean_spec.rb +3 -0
  622. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +336 -0
  623. data/spec/mongoid/extensions/date_spec.rb +9 -160
  624. data/spec/mongoid/extensions/date_time_spec.rb +18 -60
  625. data/spec/mongoid/extensions/decimal128_spec.rb +3 -0
  626. data/spec/mongoid/extensions/false_class_spec.rb +4 -1
  627. data/spec/mongoid/extensions/float_spec.rb +18 -3
  628. data/spec/mongoid/extensions/hash_spec.rb +124 -1
  629. data/spec/mongoid/extensions/integer_spec.rb +15 -2
  630. data/spec/mongoid/extensions/module_spec.rb +3 -0
  631. data/spec/mongoid/extensions/nil_class_spec.rb +3 -0
  632. data/spec/mongoid/extensions/object_id_spec.rb +3 -0
  633. data/spec/mongoid/extensions/object_spec.rb +21 -35
  634. data/spec/mongoid/extensions/range_spec.rb +10 -0
  635. data/spec/mongoid/extensions/regexp_spec.rb +3 -0
  636. data/spec/mongoid/extensions/set_spec.rb +3 -0
  637. data/spec/mongoid/extensions/string_spec.rb +94 -32
  638. data/spec/mongoid/extensions/stringified_symbol_spec.rb +85 -0
  639. data/spec/mongoid/extensions/symbol_spec.rb +3 -0
  640. data/spec/mongoid/extensions/time_spec.rb +30 -0
  641. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -0
  642. data/spec/mongoid/extensions/true_class_spec.rb +4 -1
  643. data/spec/mongoid/extensions_spec.rb +3 -0
  644. data/spec/mongoid/factory_spec.rb +301 -23
  645. data/spec/mongoid/fields/foreign_key_spec.rb +27 -32
  646. data/spec/mongoid/fields/localized_spec.rb +7 -4
  647. data/spec/mongoid/fields/standard_spec.rb +3 -0
  648. data/spec/mongoid/fields_spec.rb +94 -7
  649. data/spec/mongoid/findable_spec.rb +36 -1
  650. data/spec/mongoid/indexable/specification_spec.rb +3 -0
  651. data/spec/mongoid/indexable_spec.rb +55 -14
  652. data/spec/mongoid/inspectable_spec.rb +40 -2
  653. data/spec/mongoid/interceptable_spec.rb +89 -3
  654. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  655. data/spec/mongoid/loggable_spec.rb +3 -0
  656. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  657. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  658. data/spec/mongoid/matcher/extract_attribute_spec.rb +37 -0
  659. data/spec/mongoid/persistable/creatable_spec.rb +111 -25
  660. data/spec/mongoid/persistable/deletable_spec.rb +264 -1
  661. data/spec/mongoid/persistable/destroyable_spec.rb +194 -3
  662. data/spec/mongoid/persistable/incrementable_spec.rb +17 -0
  663. data/spec/mongoid/persistable/logical_spec.rb +17 -0
  664. data/spec/mongoid/persistable/poppable_spec.rb +17 -0
  665. data/spec/mongoid/persistable/pullable_spec.rb +31 -0
  666. data/spec/mongoid/persistable/pushable_spec.rb +86 -1
  667. data/spec/mongoid/persistable/renamable_spec.rb +17 -0
  668. data/spec/mongoid/persistable/savable_spec.rb +176 -17
  669. data/spec/mongoid/persistable/settable_spec.rb +142 -10
  670. data/spec/mongoid/persistable/unsettable_spec.rb +17 -0
  671. data/spec/mongoid/persistable/updatable_spec.rb +3 -0
  672. data/spec/mongoid/persistable/upsertable_spec.rb +4 -1
  673. data/spec/mongoid/persistable_spec.rb +106 -14
  674. data/spec/mongoid/persistence_context_spec.rb +4 -1
  675. data/spec/mongoid/positional_spec.rb +3 -0
  676. data/spec/mongoid/query_cache_middleware_spec.rb +69 -0
  677. data/spec/mongoid/query_cache_spec.rb +532 -65
  678. data/spec/mongoid/relations/proxy_spec.rb +127 -124
  679. data/spec/mongoid/reloadable_spec.rb +93 -1
  680. data/spec/mongoid/scopable_spec.rb +5 -1
  681. data/spec/mongoid/selectable_spec.rb +3 -0
  682. data/spec/mongoid/serializable_spec.rb +152 -20
  683. data/spec/mongoid/shardable_models.rb +61 -0
  684. data/spec/mongoid/shardable_spec.rb +146 -26
  685. data/spec/mongoid/stateful_spec.rb +3 -0
  686. data/spec/mongoid/tasks/database_rake_spec.rb +16 -13
  687. data/spec/mongoid/tasks/database_spec.rb +4 -1
  688. data/spec/mongoid/threaded_spec.rb +3 -0
  689. data/spec/mongoid/timestamps/created/short_spec.rb +3 -0
  690. data/spec/mongoid/timestamps/created_spec.rb +3 -0
  691. data/spec/mongoid/timestamps/timeless_spec.rb +3 -0
  692. data/spec/mongoid/timestamps/updated/short_spec.rb +3 -0
  693. data/spec/mongoid/timestamps/updated_spec.rb +3 -0
  694. data/spec/mongoid/timestamps_spec.rb +3 -0
  695. data/spec/mongoid/touchable_spec.rb +575 -0
  696. data/spec/mongoid/touchable_spec_models.rb +52 -0
  697. data/spec/mongoid/traversable_spec.rb +1103 -0
  698. data/spec/mongoid/validatable/associated_spec.rb +4 -1
  699. data/spec/mongoid/validatable/format_spec.rb +3 -0
  700. data/spec/mongoid/validatable/length_spec.rb +3 -0
  701. data/spec/mongoid/validatable/numericality_spec.rb +3 -0
  702. data/spec/mongoid/validatable/presence_spec.rb +10 -6
  703. data/spec/mongoid/validatable/uniqueness_spec.rb +36 -6
  704. data/spec/mongoid/validatable_spec.rb +4 -1
  705. data/spec/mongoid_spec.rb +3 -0
  706. data/spec/rails/controller_extension/controller_runtime_spec.rb +4 -1
  707. data/spec/rails/mongoid_spec.rb +5 -2
  708. data/spec/shared/LICENSE +20 -0
  709. data/spec/shared/bin/get-mongodb-download-url +17 -0
  710. data/spec/shared/bin/s3-copy +45 -0
  711. data/spec/shared/bin/s3-upload +69 -0
  712. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  713. data/spec/shared/lib/mrss/cluster_config.rb +226 -0
  714. data/spec/shared/lib/mrss/constraints.rb +368 -0
  715. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  716. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  717. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  718. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  719. data/spec/shared/lib/mrss/utils.rb +15 -0
  720. data/spec/shared/share/Dockerfile.erb +322 -0
  721. data/spec/shared/share/haproxy-1.conf +16 -0
  722. data/spec/shared/share/haproxy-2.conf +17 -0
  723. data/spec/shared/shlib/distro.sh +73 -0
  724. data/spec/shared/shlib/server.sh +317 -0
  725. data/spec/shared/shlib/set_env.sh +131 -0
  726. data/spec/spec_helper.rb +65 -58
  727. data/spec/support/authorization.rb +3 -0
  728. data/spec/support/client_registry.rb +9 -0
  729. data/spec/support/constraints.rb +54 -0
  730. data/spec/support/expectations.rb +22 -3
  731. data/spec/support/helpers.rb +11 -0
  732. data/spec/support/macros.rb +21 -0
  733. data/spec/support/models/account.rb +39 -0
  734. data/spec/support/models/acolyte.rb +20 -0
  735. data/spec/support/models/actor.rb +21 -0
  736. data/spec/support/models/actress.rb +5 -0
  737. data/spec/support/models/address.rb +86 -0
  738. data/spec/support/models/address_component.rb +8 -0
  739. data/spec/support/models/address_number.rb +9 -0
  740. data/spec/support/models/agency.rb +8 -0
  741. data/spec/support/models/agent.rb +19 -0
  742. data/spec/support/models/album.rb +21 -0
  743. data/spec/support/models/alert.rb +10 -0
  744. data/spec/support/models/animal.rb +29 -0
  745. data/spec/support/models/answer.rb +9 -0
  746. data/spec/support/models/appointment.rb +10 -0
  747. data/spec/support/models/armrest.rb +10 -0
  748. data/spec/support/models/array_field.rb +8 -0
  749. data/spec/support/models/article.rb +15 -0
  750. data/spec/support/models/artist.rb +90 -0
  751. data/spec/support/models/artwork.rb +7 -0
  752. data/spec/support/models/audio.rb +8 -0
  753. data/spec/support/models/augmentation.rb +14 -0
  754. data/spec/support/models/author.rb +9 -0
  755. data/spec/support/models/baby.rb +7 -0
  756. data/spec/support/models/band.rb +34 -0
  757. data/spec/support/models/bar.rb +13 -0
  758. data/spec/support/models/basic.rb +9 -0
  759. data/spec/support/models/bed.rb +4 -0
  760. data/spec/support/models/big_palette.rb +5 -0
  761. data/spec/support/models/birthday.rb +16 -0
  762. data/spec/support/models/bolt.rb +8 -0
  763. data/spec/support/models/bomb.rb +7 -0
  764. data/spec/support/models/book.rb +19 -0
  765. data/spec/support/models/breed.rb +7 -0
  766. data/spec/support/models/browser.rb +9 -0
  767. data/spec/support/models/building.rb +9 -0
  768. data/spec/support/models/building_address.rb +10 -0
  769. data/spec/support/models/bus.rb +10 -0
  770. data/spec/support/models/business.rb +8 -0
  771. data/spec/support/models/callback_test.rb +12 -0
  772. data/spec/support/models/canvas.rb +28 -0
  773. data/spec/support/models/car.rb +4 -0
  774. data/spec/support/models/cat.rb +11 -0
  775. data/spec/support/models/category.rb +11 -0
  776. data/spec/support/models/child.rb +7 -0
  777. data/spec/support/models/child_doc.rb +25 -0
  778. data/spec/support/models/church.rb +9 -0
  779. data/spec/support/models/circle.rb +6 -0
  780. data/spec/support/models/circuit.rb +7 -0
  781. data/spec/support/models/circus.rb +10 -0
  782. data/spec/support/models/code.rb +14 -0
  783. data/spec/support/models/coding/pull_request.rb +12 -0
  784. data/spec/support/models/coding.rb +4 -0
  785. data/spec/support/models/comment.rb +19 -0
  786. data/spec/support/models/company.rb +8 -0
  787. data/spec/support/models/consumption_period.rb +10 -0
  788. data/spec/support/models/contextable_item.rb +8 -0
  789. data/spec/support/models/contractor.rb +8 -0
  790. data/spec/support/models/cookie.rb +9 -0
  791. data/spec/support/models/country_code.rb +11 -0
  792. data/spec/support/models/courier_job.rb +7 -0
  793. data/spec/support/models/crate.rb +13 -0
  794. data/spec/support/models/customer.rb +11 -0
  795. data/spec/support/models/customer_address.rb +12 -0
  796. data/spec/support/models/deed.rb +8 -0
  797. data/spec/support/models/definition.rb +12 -0
  798. data/spec/support/models/delegating_patient.rb +16 -0
  799. data/spec/support/models/description.rb +14 -0
  800. data/spec/support/models/dictionary.rb +19 -0
  801. data/spec/support/models/division.rb +13 -0
  802. data/spec/support/models/doctor.rb +15 -0
  803. data/spec/support/models/dog.rb +10 -0
  804. data/spec/support/models/dokument.rb +9 -0
  805. data/spec/support/models/draft.rb +12 -0
  806. data/spec/support/models/dragon.rb +7 -0
  807. data/spec/support/models/driver.rb +10 -0
  808. data/spec/support/models/drug.rb +9 -0
  809. data/spec/support/models/dungeon.rb +7 -0
  810. data/spec/support/models/edit.rb +8 -0
  811. data/spec/support/models/email.rb +9 -0
  812. data/spec/support/models/employer.rb +8 -0
  813. data/spec/support/models/entry.rb +9 -0
  814. data/spec/support/models/eraser.rb +4 -0
  815. data/spec/support/models/even.rb +10 -0
  816. data/spec/support/models/event.rb +25 -0
  817. data/spec/support/models/exhibition.rb +7 -0
  818. data/spec/support/models/exhibitor.rb +9 -0
  819. data/spec/support/models/explosion.rb +7 -0
  820. data/spec/support/models/eye.rb +12 -0
  821. data/spec/support/models/eye_bowl.rb +12 -0
  822. data/spec/support/models/face.rb +11 -0
  823. data/spec/support/models/favorite.rb +9 -0
  824. data/spec/support/models/filesystem.rb +8 -0
  825. data/spec/support/models/fire_hydrant.rb +9 -0
  826. data/spec/support/models/firefox.rb +7 -0
  827. data/spec/support/models/fish.rb +10 -0
  828. data/spec/support/models/folder.rb +10 -0
  829. data/spec/support/models/folder_item.rb +12 -0
  830. data/spec/support/models/fruits.rb +37 -0
  831. data/spec/support/models/game.rb +22 -0
  832. data/spec/support/models/ghost.rb +10 -0
  833. data/spec/support/models/guitar.rb +5 -0
  834. data/spec/support/models/hole.rb +13 -0
  835. data/spec/support/models/home.rb +7 -0
  836. data/spec/support/models/house.rb +9 -0
  837. data/spec/support/models/html_writer.rb +6 -0
  838. data/spec/support/models/id_key.rb +9 -0
  839. data/spec/support/models/idnodef.rb +8 -0
  840. data/spec/support/models/image.rb +25 -0
  841. data/spec/support/models/implant.rb +19 -0
  842. data/spec/support/models/instrument.rb +9 -0
  843. data/spec/support/models/item.rb +11 -0
  844. data/spec/support/models/jar.rb +10 -0
  845. data/spec/support/models/kaleidoscope.rb +9 -0
  846. data/spec/support/models/kangaroo.rb +7 -0
  847. data/spec/support/models/label.rb +50 -0
  848. data/spec/support/models/language.rb +8 -0
  849. data/spec/support/models/lat_lng.rb +18 -0
  850. data/spec/support/models/league.rb +14 -0
  851. data/spec/support/models/learner.rb +5 -0
  852. data/spec/support/models/line_item.rb +9 -0
  853. data/spec/support/models/location.rb +11 -0
  854. data/spec/support/models/login.rb +11 -0
  855. data/spec/support/models/manufacturer.rb +10 -0
  856. data/spec/support/models/meat.rb +7 -0
  857. data/spec/support/models/membership.rb +7 -0
  858. data/spec/support/models/message.rb +14 -0
  859. data/spec/support/models/minim.rb +7 -0
  860. data/spec/support/models/mixed_drink.rb +7 -0
  861. data/spec/support/models/mop.rb +25 -0
  862. data/spec/support/models/movie.rb +16 -0
  863. data/spec/support/models/my_hash.rb +5 -0
  864. data/spec/support/models/name.rb +27 -0
  865. data/spec/support/models/name_only.rb +9 -0
  866. data/spec/support/models/node.rb +8 -0
  867. data/spec/support/models/note.rb +20 -0
  868. data/spec/support/models/nut.rb +8 -0
  869. data/spec/support/models/odd.rb +10 -0
  870. data/spec/support/models/order.rb +11 -0
  871. data/spec/support/models/ordered_post.rb +14 -0
  872. data/spec/support/models/ordered_preference.rb +9 -0
  873. data/spec/support/models/oscar.rb +17 -0
  874. data/spec/support/models/other_owner_object.rb +5 -0
  875. data/spec/support/models/override.rb +19 -0
  876. data/spec/support/models/ownable.rb +9 -0
  877. data/spec/support/models/owner.rb +11 -0
  878. data/spec/support/models/pack.rb +6 -0
  879. data/spec/support/models/page.rb +19 -0
  880. data/spec/support/models/page_question.rb +7 -0
  881. data/spec/support/models/palette.rb +10 -0
  882. data/spec/support/models/parent.rb +8 -0
  883. data/spec/support/models/parent_doc.rb +9 -0
  884. data/spec/support/models/passport.rb +9 -0
  885. data/spec/support/models/patient.rb +12 -0
  886. data/spec/support/models/pdf_writer.rb +6 -0
  887. data/spec/support/models/pencil.rb +4 -0
  888. data/spec/support/models/person.rb +230 -0
  889. data/spec/support/models/pet.rb +26 -0
  890. data/spec/support/models/pet_owner.rb +9 -0
  891. data/spec/support/models/phone.rb +13 -0
  892. data/spec/support/models/piano.rb +5 -0
  893. data/spec/support/models/pizza.rb +10 -0
  894. data/spec/support/models/player.rb +38 -0
  895. data/spec/support/models/post.rb +53 -0
  896. data/spec/support/models/post_genre.rb +9 -0
  897. data/spec/support/models/powerup.rb +14 -0
  898. data/spec/support/models/preference.rb +12 -0
  899. data/spec/support/models/princess.rb +13 -0
  900. data/spec/support/models/product.rb +20 -0
  901. data/spec/support/models/profile.rb +18 -0
  902. data/spec/support/models/pronunciation.rb +8 -0
  903. data/spec/support/models/pub.rb +9 -0
  904. data/spec/support/models/publication/encyclopedia.rb +12 -0
  905. data/spec/support/models/publication/review.rb +14 -0
  906. data/spec/support/models/publication.rb +5 -0
  907. data/spec/support/models/purchase.rb +7 -0
  908. data/spec/support/models/question.rb +11 -0
  909. data/spec/support/models/quiz.rb +10 -0
  910. data/spec/support/models/rating.rb +11 -0
  911. data/spec/support/models/record.rb +55 -0
  912. data/spec/support/models/registry.rb +7 -0
  913. data/spec/support/models/role.rb +10 -0
  914. data/spec/support/models/root_category.rb +7 -0
  915. data/spec/support/models/sandwich.rb +12 -0
  916. data/spec/support/models/scheduler.rb +10 -0
  917. data/spec/support/models/scribe.rb +8 -0
  918. data/spec/support/models/sealer.rb +8 -0
  919. data/spec/support/models/seat.rb +25 -0
  920. data/spec/support/models/seo.rb +10 -0
  921. data/spec/support/models/series.rb +8 -0
  922. data/spec/support/models/server.rb +16 -0
  923. data/spec/support/models/service.rb +25 -0
  924. data/spec/support/models/shape.rb +15 -0
  925. data/spec/support/models/shelf.rb +8 -0
  926. data/spec/support/models/shipment_address.rb +6 -0
  927. data/spec/support/models/shipping_container.rb +8 -0
  928. data/spec/support/models/shipping_pack.rb +6 -0
  929. data/spec/support/models/shirt.rb +12 -0
  930. data/spec/support/models/shop.rb +9 -0
  931. data/spec/support/models/short_agent.rb +7 -0
  932. data/spec/support/models/short_quiz.rb +8 -0
  933. data/spec/support/models/simple.rb +8 -0
  934. data/spec/support/models/slave.rb +9 -0
  935. data/spec/support/models/song.rb +11 -0
  936. data/spec/support/models/sound.rb +8 -0
  937. data/spec/support/models/spacer.rb +8 -0
  938. data/spec/support/models/square.rb +7 -0
  939. data/spec/support/models/staff.rb +10 -0
  940. data/spec/support/models/store_as_dup_test1.rb +8 -0
  941. data/spec/support/models/store_as_dup_test2.rb +8 -0
  942. data/spec/support/models/store_as_dup_test3.rb +8 -0
  943. data/spec/support/models/store_as_dup_test4.rb +8 -0
  944. data/spec/support/models/strategy.rb +6 -0
  945. data/spec/support/models/sub_item.rb +6 -0
  946. data/spec/support/models/subscription.rb +8 -0
  947. data/spec/support/models/survey.rb +8 -0
  948. data/spec/support/models/symptom.rb +9 -0
  949. data/spec/support/models/system_role.rb +7 -0
  950. data/spec/support/models/tag.rb +11 -0
  951. data/spec/support/models/target.rb +8 -0
  952. data/spec/support/models/template.rb +8 -0
  953. data/spec/support/models/thing.rb +12 -0
  954. data/spec/support/models/threadlocker.rb +8 -0
  955. data/spec/support/models/title.rb +6 -0
  956. data/spec/support/models/tool.rb +11 -0
  957. data/spec/support/models/topping.rb +8 -0
  958. data/spec/support/models/toy.rb +10 -0
  959. data/spec/support/models/track.rb +41 -0
  960. data/spec/support/models/translation.rb +8 -0
  961. data/spec/support/models/tree.rb +12 -0
  962. data/spec/support/models/truck.rb +8 -0
  963. data/spec/support/models/updatable.rb +8 -0
  964. data/spec/support/models/user.rb +24 -0
  965. data/spec/support/models/user_account.rb +13 -0
  966. data/spec/support/models/validation_callback.rb +13 -0
  967. data/spec/support/models/vehicle.rb +19 -0
  968. data/spec/support/models/version.rb +8 -0
  969. data/spec/support/models/vertex.rb +9 -0
  970. data/spec/support/models/vet_visit.rb +8 -0
  971. data/spec/support/models/video.rb +16 -0
  972. data/spec/support/models/video_game.rb +4 -0
  973. data/spec/support/models/washer.rb +8 -0
  974. data/spec/support/models/weapon.rb +14 -0
  975. data/spec/support/models/wiki_page.rb +18 -0
  976. data/spec/support/models/word.rb +18 -0
  977. data/spec/support/models/word_origin.rb +14 -0
  978. data/spec/support/models/writer.rb +14 -0
  979. data/spec/support/session_registry.rb +50 -0
  980. data/spec/support/shared/time.rb +54 -0
  981. data/spec/support/spec_config.rb +58 -0
  982. data.tar.gz.sig +0 -0
  983. metadata +1226 -814
  984. metadata.gz.sig +0 -0
  985. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  986. data/lib/mongoid/matchable/all.rb +0 -27
  987. data/lib/mongoid/matchable/and.rb +0 -30
  988. data/lib/mongoid/matchable/default.rb +0 -72
  989. data/lib/mongoid/matchable/elem_match.rb +0 -28
  990. data/lib/mongoid/matchable/exists.rb +0 -23
  991. data/lib/mongoid/matchable/gt.rb +0 -23
  992. data/lib/mongoid/matchable/gte.rb +0 -23
  993. data/lib/mongoid/matchable/in.rb +0 -24
  994. data/lib/mongoid/matchable/lt.rb +0 -23
  995. data/lib/mongoid/matchable/lte.rb +0 -23
  996. data/lib/mongoid/matchable/ne.rb +0 -21
  997. data/lib/mongoid/matchable/nin.rb +0 -22
  998. data/lib/mongoid/matchable/nor.rb +0 -37
  999. data/lib/mongoid/matchable/or.rb +0 -33
  1000. data/lib/mongoid/matchable/regexp.rb +0 -27
  1001. data/lib/mongoid/matchable/size.rb +0 -21
  1002. data/lib/mongoid/relations/accessors.rb +0 -267
  1003. data/lib/mongoid/relations/auto_save.rb +0 -94
  1004. data/lib/mongoid/relations/binding.rb +0 -218
  1005. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  1006. data/lib/mongoid/relations/bindings/embedded/many.rb +0 -43
  1007. data/lib/mongoid/relations/bindings/embedded/one.rb +0 -45
  1008. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  1009. data/lib/mongoid/relations/bindings/referenced/many.rb +0 -38
  1010. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  1011. data/lib/mongoid/relations/bindings/referenced/one.rb +0 -44
  1012. data/lib/mongoid/relations/bindings.rb +0 -9
  1013. data/lib/mongoid/relations/builder.rb +0 -57
  1014. data/lib/mongoid/relations/builders/embedded/in.rb +0 -29
  1015. data/lib/mongoid/relations/builders/embedded/many.rb +0 -36
  1016. data/lib/mongoid/relations/builders/embedded/one.rb +0 -30
  1017. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  1018. data/lib/mongoid/relations/builders/nested_attributes/one.rb +0 -126
  1019. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  1020. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  1021. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  1022. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  1023. data/lib/mongoid/relations/builders.rb +0 -106
  1024. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  1025. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  1026. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  1027. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  1028. data/lib/mongoid/relations/cascading.rb +0 -56
  1029. data/lib/mongoid/relations/constraint.rb +0 -55
  1030. data/lib/mongoid/relations/conversions.rb +0 -34
  1031. data/lib/mongoid/relations/counter_cache.rb +0 -160
  1032. data/lib/mongoid/relations/cyclic.rb +0 -107
  1033. data/lib/mongoid/relations/eager/base.rb +0 -153
  1034. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  1035. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  1036. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  1037. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  1038. data/lib/mongoid/relations/eager.rb +0 -36
  1039. data/lib/mongoid/relations/embedded/batchable.rb +0 -384
  1040. data/lib/mongoid/relations/embedded/in.rb +0 -241
  1041. data/lib/mongoid/relations/embedded/many.rb +0 -683
  1042. data/lib/mongoid/relations/embedded/one.rb +0 -235
  1043. data/lib/mongoid/relations/macros.rb +0 -367
  1044. data/lib/mongoid/relations/many.rb +0 -242
  1045. data/lib/mongoid/relations/marshalable.rb +0 -32
  1046. data/lib/mongoid/relations/metadata.rb +0 -1179
  1047. data/lib/mongoid/relations/nested_builder.rb +0 -74
  1048. data/lib/mongoid/relations/one.rb +0 -60
  1049. data/lib/mongoid/relations/options.rb +0 -49
  1050. data/lib/mongoid/relations/polymorphic.rb +0 -39
  1051. data/lib/mongoid/relations/proxy.rb +0 -215
  1052. data/lib/mongoid/relations/referenced/in.rb +0 -304
  1053. data/lib/mongoid/relations/referenced/many.rb +0 -812
  1054. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -479
  1055. data/lib/mongoid/relations/referenced/one.rb +0 -290
  1056. data/lib/mongoid/relations/reflections.rb +0 -64
  1057. data/lib/mongoid/relations/synchronization.rb +0 -169
  1058. data/lib/mongoid/relations/targets/enumerable.rb +0 -493
  1059. data/lib/mongoid/relations/targets.rb +0 -2
  1060. data/lib/mongoid/relations/touchable.rb +0 -97
  1061. data/lib/mongoid/relations.rb +0 -148
  1062. data/spec/app/models/account.rb +0 -36
  1063. data/spec/app/models/acolyte.rb +0 -17
  1064. data/spec/app/models/actor.rb +0 -18
  1065. data/spec/app/models/actress.rb +0 -2
  1066. data/spec/app/models/address.rb +0 -79
  1067. data/spec/app/models/address_component.rb +0 -5
  1068. data/spec/app/models/address_number.rb +0 -6
  1069. data/spec/app/models/agency.rb +0 -5
  1070. data/spec/app/models/agent.rb +0 -16
  1071. data/spec/app/models/album.rb +0 -18
  1072. data/spec/app/models/alert.rb +0 -7
  1073. data/spec/app/models/animal.rb +0 -25
  1074. data/spec/app/models/answer.rb +0 -6
  1075. data/spec/app/models/appointment.rb +0 -7
  1076. data/spec/app/models/array_field.rb +0 -7
  1077. data/spec/app/models/article.rb +0 -12
  1078. data/spec/app/models/artist.rb +0 -87
  1079. data/spec/app/models/artwork.rb +0 -4
  1080. data/spec/app/models/audio.rb +0 -5
  1081. data/spec/app/models/augmentation.rb +0 -11
  1082. data/spec/app/models/author.rb +0 -6
  1083. data/spec/app/models/baby.rb +0 -4
  1084. data/spec/app/models/band.rb +0 -31
  1085. data/spec/app/models/bar.rb +0 -10
  1086. data/spec/app/models/basic.rb +0 -6
  1087. data/spec/app/models/bed.rb +0 -1
  1088. data/spec/app/models/big_palette.rb +0 -2
  1089. data/spec/app/models/birthday.rb +0 -13
  1090. data/spec/app/models/bomb.rb +0 -4
  1091. data/spec/app/models/book.rb +0 -16
  1092. data/spec/app/models/breed.rb +0 -4
  1093. data/spec/app/models/browser.rb +0 -6
  1094. data/spec/app/models/building.rb +0 -6
  1095. data/spec/app/models/building_address.rb +0 -7
  1096. data/spec/app/models/bus.rb +0 -7
  1097. data/spec/app/models/business.rb +0 -5
  1098. data/spec/app/models/callback_test.rb +0 -9
  1099. data/spec/app/models/canvas.rb +0 -25
  1100. data/spec/app/models/car.rb +0 -1
  1101. data/spec/app/models/cat.rb +0 -8
  1102. data/spec/app/models/category.rb +0 -8
  1103. data/spec/app/models/child.rb +0 -4
  1104. data/spec/app/models/child_doc.rb +0 -22
  1105. data/spec/app/models/church.rb +0 -6
  1106. data/spec/app/models/circle.rb +0 -3
  1107. data/spec/app/models/circuit.rb +0 -4
  1108. data/spec/app/models/circus.rb +0 -7
  1109. data/spec/app/models/code.rb +0 -11
  1110. data/spec/app/models/comment.rb +0 -16
  1111. data/spec/app/models/company.rb +0 -5
  1112. data/spec/app/models/consumption_period.rb +0 -7
  1113. data/spec/app/models/contextable_item.rb +0 -5
  1114. data/spec/app/models/contractor.rb +0 -5
  1115. data/spec/app/models/cookie.rb +0 -6
  1116. data/spec/app/models/country_code.rb +0 -8
  1117. data/spec/app/models/courier_job.rb +0 -4
  1118. data/spec/app/models/definition.rb +0 -9
  1119. data/spec/app/models/description.rb +0 -11
  1120. data/spec/app/models/dictionary.rb +0 -10
  1121. data/spec/app/models/division.rb +0 -10
  1122. data/spec/app/models/doctor.rb +0 -12
  1123. data/spec/app/models/dog.rb +0 -7
  1124. data/spec/app/models/dokument.rb +0 -6
  1125. data/spec/app/models/draft.rb +0 -9
  1126. data/spec/app/models/dragon.rb +0 -4
  1127. data/spec/app/models/driver.rb +0 -7
  1128. data/spec/app/models/drug.rb +0 -6
  1129. data/spec/app/models/dungeon.rb +0 -4
  1130. data/spec/app/models/edit.rb +0 -5
  1131. data/spec/app/models/email.rb +0 -6
  1132. data/spec/app/models/employer.rb +0 -5
  1133. data/spec/app/models/entry.rb +0 -6
  1134. data/spec/app/models/eraser.rb +0 -1
  1135. data/spec/app/models/even.rb +0 -7
  1136. data/spec/app/models/event.rb +0 -22
  1137. data/spec/app/models/exhibition.rb +0 -4
  1138. data/spec/app/models/exhibitor.rb +0 -6
  1139. data/spec/app/models/explosion.rb +0 -4
  1140. data/spec/app/models/eye.rb +0 -9
  1141. data/spec/app/models/eye_bowl.rb +0 -9
  1142. data/spec/app/models/face.rb +0 -8
  1143. data/spec/app/models/favorite.rb +0 -6
  1144. data/spec/app/models/filesystem.rb +0 -5
  1145. data/spec/app/models/fire_hydrant.rb +0 -6
  1146. data/spec/app/models/firefox.rb +0 -4
  1147. data/spec/app/models/fish.rb +0 -7
  1148. data/spec/app/models/folder.rb +0 -7
  1149. data/spec/app/models/folder_item.rb +0 -9
  1150. data/spec/app/models/fruits.rb +0 -34
  1151. data/spec/app/models/game.rb +0 -19
  1152. data/spec/app/models/ghost.rb +0 -7
  1153. data/spec/app/models/home.rb +0 -4
  1154. data/spec/app/models/house.rb +0 -6
  1155. data/spec/app/models/html_writer.rb +0 -3
  1156. data/spec/app/models/id_key.rb +0 -6
  1157. data/spec/app/models/image.rb +0 -22
  1158. data/spec/app/models/implant.rb +0 -16
  1159. data/spec/app/models/item.rb +0 -8
  1160. data/spec/app/models/jar.rb +0 -7
  1161. data/spec/app/models/kaleidoscope.rb +0 -6
  1162. data/spec/app/models/kangaroo.rb +0 -4
  1163. data/spec/app/models/label.rb +0 -47
  1164. data/spec/app/models/language.rb +0 -5
  1165. data/spec/app/models/lat_lng.rb +0 -15
  1166. data/spec/app/models/league.rb +0 -11
  1167. data/spec/app/models/learner.rb +0 -2
  1168. data/spec/app/models/line_item.rb +0 -6
  1169. data/spec/app/models/location.rb +0 -8
  1170. data/spec/app/models/login.rb +0 -8
  1171. data/spec/app/models/manufacturer.rb +0 -7
  1172. data/spec/app/models/meat.rb +0 -4
  1173. data/spec/app/models/membership.rb +0 -4
  1174. data/spec/app/models/message.rb +0 -11
  1175. data/spec/app/models/mixed_drink.rb +0 -4
  1176. data/spec/app/models/movie.rb +0 -13
  1177. data/spec/app/models/my_hash.rb +0 -2
  1178. data/spec/app/models/name.rb +0 -24
  1179. data/spec/app/models/node.rb +0 -5
  1180. data/spec/app/models/note.rb +0 -17
  1181. data/spec/app/models/odd.rb +0 -7
  1182. data/spec/app/models/ordered_post.rb +0 -11
  1183. data/spec/app/models/ordered_preference.rb +0 -6
  1184. data/spec/app/models/oscar.rb +0 -14
  1185. data/spec/app/models/override.rb +0 -16
  1186. data/spec/app/models/ownable.rb +0 -6
  1187. data/spec/app/models/owner.rb +0 -6
  1188. data/spec/app/models/pack.rb +0 -3
  1189. data/spec/app/models/page.rb +0 -16
  1190. data/spec/app/models/page_question.rb +0 -4
  1191. data/spec/app/models/palette.rb +0 -7
  1192. data/spec/app/models/parent.rb +0 -5
  1193. data/spec/app/models/parent_doc.rb +0 -6
  1194. data/spec/app/models/passport.rb +0 -5
  1195. data/spec/app/models/patient.rb +0 -9
  1196. data/spec/app/models/pdf_writer.rb +0 -3
  1197. data/spec/app/models/pencil.rb +0 -1
  1198. data/spec/app/models/person.rb +0 -207
  1199. data/spec/app/models/pet.rb +0 -23
  1200. data/spec/app/models/pet_owner.rb +0 -6
  1201. data/spec/app/models/phone.rb +0 -9
  1202. data/spec/app/models/pizza.rb +0 -7
  1203. data/spec/app/models/player.rb +0 -35
  1204. data/spec/app/models/post.rb +0 -50
  1205. data/spec/app/models/post_genre.rb +0 -6
  1206. data/spec/app/models/powerup.rb +0 -11
  1207. data/spec/app/models/preference.rb +0 -9
  1208. data/spec/app/models/princess.rb +0 -10
  1209. data/spec/app/models/product.rb +0 -17
  1210. data/spec/app/models/profile.rb +0 -5
  1211. data/spec/app/models/pronunciation.rb +0 -5
  1212. data/spec/app/models/pub.rb +0 -6
  1213. data/spec/app/models/purchase.rb +0 -4
  1214. data/spec/app/models/question.rb +0 -8
  1215. data/spec/app/models/quiz.rb +0 -7
  1216. data/spec/app/models/rating.rb +0 -8
  1217. data/spec/app/models/record.rb +0 -52
  1218. data/spec/app/models/registry.rb +0 -4
  1219. data/spec/app/models/role.rb +0 -7
  1220. data/spec/app/models/root_category.rb +0 -4
  1221. data/spec/app/models/sandwich.rb +0 -9
  1222. data/spec/app/models/scheduler.rb +0 -7
  1223. data/spec/app/models/seo.rb +0 -7
  1224. data/spec/app/models/series.rb +0 -4
  1225. data/spec/app/models/server.rb +0 -13
  1226. data/spec/app/models/service.rb +0 -22
  1227. data/spec/app/models/shape.rb +0 -12
  1228. data/spec/app/models/shelf.rb +0 -5
  1229. data/spec/app/models/shipment_address.rb +0 -2
  1230. data/spec/app/models/shipping_container.rb +0 -5
  1231. data/spec/app/models/shipping_pack.rb +0 -3
  1232. data/spec/app/models/shop.rb +0 -6
  1233. data/spec/app/models/short_agent.rb +0 -4
  1234. data/spec/app/models/short_quiz.rb +0 -5
  1235. data/spec/app/models/simple.rb +0 -5
  1236. data/spec/app/models/slave.rb +0 -6
  1237. data/spec/app/models/song.rb +0 -8
  1238. data/spec/app/models/sound.rb +0 -5
  1239. data/spec/app/models/square.rb +0 -4
  1240. data/spec/app/models/staff.rb +0 -7
  1241. data/spec/app/models/store_as_dup_test1.rb +0 -5
  1242. data/spec/app/models/store_as_dup_test2.rb +0 -5
  1243. data/spec/app/models/strategy.rb +0 -3
  1244. data/spec/app/models/sub_item.rb +0 -3
  1245. data/spec/app/models/subscription.rb +0 -5
  1246. data/spec/app/models/survey.rb +0 -5
  1247. data/spec/app/models/symptom.rb +0 -6
  1248. data/spec/app/models/tag.rb +0 -8
  1249. data/spec/app/models/target.rb +0 -5
  1250. data/spec/app/models/template.rb +0 -5
  1251. data/spec/app/models/thing.rb +0 -9
  1252. data/spec/app/models/title.rb +0 -3
  1253. data/spec/app/models/tool.rb +0 -8
  1254. data/spec/app/models/topping.rb +0 -5
  1255. data/spec/app/models/track.rb +0 -38
  1256. data/spec/app/models/translation.rb +0 -5
  1257. data/spec/app/models/tree.rb +0 -9
  1258. data/spec/app/models/truck.rb +0 -3
  1259. data/spec/app/models/user.rb +0 -21
  1260. data/spec/app/models/user_account.rb +0 -10
  1261. data/spec/app/models/validation_callback.rb +0 -10
  1262. data/spec/app/models/vehicle.rb +0 -11
  1263. data/spec/app/models/version.rb +0 -5
  1264. data/spec/app/models/vet_visit.rb +0 -5
  1265. data/spec/app/models/video.rb +0 -13
  1266. data/spec/app/models/video_game.rb +0 -1
  1267. data/spec/app/models/weapon.rb +0 -11
  1268. data/spec/app/models/wiki_page.rb +0 -14
  1269. data/spec/app/models/word.rb +0 -15
  1270. data/spec/app/models/word_origin.rb +0 -11
  1271. data/spec/app/models/writer.rb +0 -11
  1272. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
  1273. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  1274. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  1275. data/spec/mongoid/matchable/all_spec.rb +0 -31
  1276. data/spec/mongoid/matchable/and_spec.rb +0 -187
  1277. data/spec/mongoid/matchable/default_spec.rb +0 -130
  1278. data/spec/mongoid/matchable/elem_match_spec.rb +0 -86
  1279. data/spec/mongoid/matchable/exists_spec.rb +0 -57
  1280. data/spec/mongoid/matchable/gt_spec.rb +0 -86
  1281. data/spec/mongoid/matchable/gte_spec.rb +0 -84
  1282. data/spec/mongoid/matchable/in_spec.rb +0 -49
  1283. data/spec/mongoid/matchable/lt_spec.rb +0 -85
  1284. data/spec/mongoid/matchable/lte_spec.rb +0 -85
  1285. data/spec/mongoid/matchable/ne_spec.rb +0 -46
  1286. data/spec/mongoid/matchable/nin_spec.rb +0 -48
  1287. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  1288. data/spec/mongoid/matchable/or_spec.rb +0 -131
  1289. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
  1290. data/spec/mongoid/matchable/size_spec.rb +0 -25
  1291. data/spec/mongoid/matchable_spec.rb +0 -853
  1292. data/spec/mongoid/relations/accessors_spec.rb +0 -821
  1293. data/spec/mongoid/relations/auto_save_spec.rb +0 -314
  1294. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +0 -171
  1295. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +0 -54
  1296. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +0 -77
  1297. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +0 -241
  1298. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +0 -153
  1299. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +0 -178
  1300. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +0 -131
  1301. data/spec/mongoid/relations/builders/embedded/in_spec.rb +0 -34
  1302. data/spec/mongoid/relations/builders/embedded/many_spec.rb +0 -132
  1303. data/spec/mongoid/relations/builders/embedded/one_spec.rb +0 -99
  1304. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +0 -233
  1305. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +0 -250
  1306. data/spec/mongoid/relations/builders/referenced/in_spec.rb +0 -230
  1307. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  1308. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  1309. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  1310. data/spec/mongoid/relations/builders_spec.rb +0 -253
  1311. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  1312. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  1313. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  1314. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  1315. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  1316. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  1317. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  1318. data/spec/mongoid/relations/counter_cache_spec.rb +0 -450
  1319. data/spec/mongoid/relations/cyclic_spec.rb +0 -178
  1320. data/spec/mongoid/relations/eager/belongs_to_spec.rb +0 -163
  1321. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +0 -133
  1322. data/spec/mongoid/relations/eager/has_many_spec.rb +0 -244
  1323. data/spec/mongoid/relations/eager/has_one_spec.rb +0 -163
  1324. data/spec/mongoid/relations/eager_spec.rb +0 -279
  1325. data/spec/mongoid/relations/embedded/dirty_spec.rb +0 -65
  1326. data/spec/mongoid/relations/embedded/in_spec.rb +0 -579
  1327. data/spec/mongoid/relations/embedded/many_spec.rb +0 -4412
  1328. data/spec/mongoid/relations/embedded/one_spec.rb +0 -1068
  1329. data/spec/mongoid/relations/macros_spec.rb +0 -1039
  1330. data/spec/mongoid/relations/metadata_spec.rb +0 -1985
  1331. data/spec/mongoid/relations/options_spec.rb +0 -35
  1332. data/spec/mongoid/relations/polymorphic_spec.rb +0 -128
  1333. data/spec/mongoid/relations/referenced/in_spec.rb +0 -1366
  1334. data/spec/mongoid/relations/referenced/many_spec.rb +0 -3816
  1335. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +0 -3577
  1336. data/spec/mongoid/relations/referenced/one_spec.rb +0 -1240
  1337. data/spec/mongoid/relations/reflections_spec.rb +0 -101
  1338. data/spec/mongoid/relations/synchronization_spec.rb +0 -495
  1339. data/spec/mongoid/relations/targets/enumerable_spec.rb +0 -1825
  1340. data/spec/mongoid/relations/touchable_spec.rb +0 -402
  1341. data/spec/mongoid/relations_spec.rb +0 -189
@@ -1,242 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
-
5
- # This is the superclass for all many to one and many to many relation
6
- # proxies.
7
- class Many < Proxy
8
- include ::Enumerable
9
-
10
- delegate :avg, :max, :min, :sum, to: :criteria
11
- delegate :length, :size, to: :target
12
-
13
- # Is the relation empty?
14
- #
15
- # @example Is the relation empty??
16
- # person.addresses.blank?
17
- #
18
- # @return [ true, false ] If the relation is empty or not.
19
- #
20
- # @since 2.1.0
21
- def blank?
22
- size == 0
23
- end
24
-
25
- # Creates a new document on the references many relation. This will
26
- # save the document if the parent has been persisted.
27
- #
28
- # @example Create and save the new document.
29
- # person.posts.create(:text => "Testing")
30
- #
31
- # @overload create(attributes = nil, options = {}, type = nil)
32
- # @param [ Hash ] attributes The attributes to create with.
33
- # @param [ Hash ] options The scoped assignment options.
34
- # @param [ Class ] type The optional type of document to create.
35
- #
36
- # @overload create(attributes = nil, type = nil)
37
- # @param [ Hash ] attributes The attributes to create with.
38
- # @param [ Class ] type The optional type of document to create.
39
- #
40
- # @return [ Document ] The newly created document.
41
- #
42
- # @since 2.0.0.beta.1
43
- def create(attributes = nil, type = nil, &block)
44
- if attributes.is_a?(::Array)
45
- attributes.map { |attrs| create(attrs, type, &block) }
46
- else
47
- doc = build(attributes, type, &block)
48
- base.persisted? ? doc.save : raise_unsaved(doc)
49
- doc
50
- end
51
- end
52
-
53
- # Creates a new document on the references many relation. This will
54
- # save the document if the parent has been persisted and will raise an
55
- # error if validation fails.
56
- #
57
- # @example Create and save the new document.
58
- # person.posts.create!(:text => "Testing")
59
- #
60
- # @overload create!(attributes = nil, options = {}, type = nil)
61
- # @param [ Hash ] attributes The attributes to create with.
62
- # @param [ Class ] type The optional type of document to create.
63
- #
64
- # @overload create!(attributes = nil, type = nil)
65
- # @param [ Hash ] attributes The attributes to create with.
66
- # @param [ Class ] type The optional type of document to create.
67
- #
68
- # @raise [ Errors::Validations ] If validation failed.
69
- #
70
- # @return [ Document ] The newly created document.
71
- #
72
- # @since 2.0.0.beta.1
73
- def create!(attributes = nil, type = nil, &block)
74
- if attributes.is_a?(::Array)
75
- attributes.map { |attrs| create!(attrs, type, &block) }
76
- else
77
- doc = build(attributes, type, &block)
78
- base.persisted? ? doc.save! : raise_unsaved(doc)
79
- doc
80
- end
81
- end
82
-
83
- # Find the first document given the conditions, or creates a new document
84
- # with the conditions that were supplied.
85
- #
86
- # @example Find or create.
87
- # person.posts.find_or_create_by(:title => "Testing")
88
- #
89
- # @overload find_or_create_by(attributes = nil, type = nil)
90
- # @param [ Hash ] attributes The attributes to search or create with.
91
- # @param [ Class ] type The optional type of document to create.
92
- #
93
- # @overload find_or_create_by(attributes = nil, type = nil)
94
- # @param [ Hash ] attributes The attributes to search or create with.
95
- # @param [ Class ] type The optional type of document to create.
96
- #
97
- # @return [ Document ] An existing document or newly created one.
98
- def find_or_create_by(attrs = {}, type = nil, &block)
99
- find_or(:create, attrs, type, &block)
100
- end
101
-
102
- # Find the first document given the conditions, or creates a new document
103
- # with the conditions that were supplied. This will raise an error if validation fails.
104
- #
105
- # @example Find or create.
106
- # person.posts.find_or_create_by!(:title => "Testing")
107
- #
108
- # @overload find_or_create_by!(attributes = nil, type = nil)
109
- # @param [ Hash ] attributes The attributes to search or create with.
110
- # @param [ Class ] type The optional type of document to create.
111
- #
112
- # @overload find_or_create_by!(attributes = nil, type = nil)
113
- # @param [ Hash ] attributes The attributes to search or create with.
114
- # @param [ Class ] type The optional type of document to create.
115
- #
116
- # @raise [ Errors::Validations ] If validation failed.
117
- #
118
- # @return [ Document ] An existing document or newly created one.
119
- def find_or_create_by!(attrs = {}, type = nil, &block)
120
- find_or(:create!, attrs, type, &block)
121
- end
122
-
123
- # Find the first +Document+ given the conditions, or instantiates a new document
124
- # with the conditions that were supplied
125
- #
126
- # @example Find or initialize.
127
- # person.posts.find_or_initialize_by(:title => "Test")
128
- #
129
- # @overload find_or_initialize_by(attributes = {}, type = nil)
130
- # @param [ Hash ] attributes The attributes to search or initialize with.
131
- # @param [ Class ] type The optional subclass to build.
132
- #
133
- # @overload find_or_initialize_by(attributes = {}, type = nil)
134
- # @param [ Hash ] attributes The attributes to search or initialize with.
135
- # @param [ Class ] type The optional subclass to build.
136
- #
137
- # @return [ Document ] An existing document or newly instantiated one.
138
- def find_or_initialize_by(attrs = {}, type = nil, &block)
139
- find_or(:build, attrs, type, &block)
140
- end
141
-
142
- # This proxy can never be nil.
143
- #
144
- # @example Is the proxy nil?
145
- # relation.nil?
146
- #
147
- # @return [ false ] Always false.
148
- #
149
- # @since 2.0.0
150
- def nil?
151
- false
152
- end
153
-
154
- # Since method_missing is overridden we should override this as well.
155
- #
156
- # @example Does the proxy respond to the method?
157
- # relation.respond_to?(:name)
158
- #
159
- # @param [ Symbol ] name The method name.
160
- #
161
- # @return [ true, false ] If the proxy responds to the method.
162
- #
163
- # @since 2.0.0
164
- def respond_to?(name, include_private = false)
165
- [].respond_to?(name, include_private) ||
166
- klass.respond_to?(name, include_private) || super
167
- end
168
-
169
- # This is public access to the relation's criteria.
170
- #
171
- # @example Get the scoped relation.
172
- # relation.scoped
173
- #
174
- # @return [ Criteria ] The scoped criteria.
175
- #
176
- # @since 2.1.0
177
- def scoped
178
- criteria
179
- end
180
-
181
- # Gets the document as a serializable hash, used by ActiveModel's JSON and
182
- # XML serializers. This override is just to be able to pass the :include
183
- # and :except options to get associations in the hash.
184
- #
185
- # @example Get the serializable hash.
186
- # relation.serializable_hash
187
- #
188
- # @param [ Hash ] options The options to pass.
189
- #
190
- # @option options [ Symbol ] :include What relations to include
191
- # @option options [ Symbol ] :only Limit the fields to only these.
192
- # @option options [ Symbol ] :except Dont include these fields.
193
- #
194
- # @return [ Hash ] The documents, ready to be serialized.
195
- #
196
- # @since 2.0.0.rc.6
197
- def serializable_hash(options = {})
198
- target.map { |document| document.serializable_hash(options) }
199
- end
200
-
201
- # Get a criteria for the embedded documents without the default scoping
202
- # applied.
203
- #
204
- # @example Get the unscoped criteria.
205
- # person.addresses.unscoped
206
- #
207
- # @return [ Criteria ] The unscoped criteria.
208
- #
209
- # @since 2.4.0
210
- def unscoped
211
- criteria.unscoped
212
- end
213
-
214
- private
215
-
216
- def _session
217
- base.send(:_session)
218
- end
219
-
220
- # Find the first object given the supplied attributes or create/initialize it.
221
- #
222
- # @example Find or create|initialize.
223
- # person.addresses.find_or(:create, :street => "Bond")
224
- #
225
- # @overload find_or(method, attributes = {}, type = nil)
226
- # @param [ Symbol ] method The method name, create or new.
227
- # @param [ Hash ] attributes The attributes to search or build with.
228
- # @param [ Class ] type The optional subclass to build.
229
- #
230
- # @overload find_or(attributes = {}, type = nil)
231
- # @param [ Symbol ] method The method name, create or new.
232
- # @param [ Hash ] attributes The attributes to search or build with.
233
- # @param [ Class ] type The optional subclass to build.
234
- #
235
- # @return [ Document ] A matching document or a new/created one.
236
- def find_or(method, attrs = {}, type = nil, &block)
237
- attrs["_type"] = type.to_s if type
238
- where(attrs).first || send(method, attrs, type, &block)
239
- end
240
- end
241
- end
242
- end
@@ -1,32 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
- module Marshalable
5
-
6
- # Provides the data needed to Marshal.dump a relation proxy.
7
- #
8
- # @example Dump the proxy.
9
- # Marshal.dump(proxy)
10
- #
11
- # @return [ Array<Object> ] The dumped data.
12
- #
13
- # @since 3.0.15
14
- def marshal_dump
15
- [ base, target, __metadata ]
16
- end
17
-
18
- # Takes the provided data and sets it back on the proxy.
19
- #
20
- # @example Load the proxy.
21
- # Marshal.load(proxy)
22
- #
23
- # @return [ Array<Object> ] The loaded data.
24
- #
25
- # @since 3.0.15
26
- def marshal_load(data)
27
- @base, @target, @__metadata = data
28
- extend_proxy(__metadata.extension) if __metadata.extension?
29
- end
30
- end
31
- end
32
- end
@@ -1,1179 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid
3
- module Relations
4
-
5
- # The "Grand Poobah" of information about any relation is this class. It
6
- # contains everything you could ever possible want to know.
7
- class Metadata < Hash
8
-
9
- delegate :foreign_key_default, :stores_foreign_key?, to: :relation
10
-
11
- # Returns the as option of the relation.
12
- #
13
- # @example Get the as option.
14
- # metadata.as
15
- #
16
- # @return [ true, false ] The as option.
17
- #
18
- # @since 2.1.0
19
- def as
20
- self[:as]
21
- end
22
-
23
- # Tells whether an as option exists.
24
- #
25
- # @example Is the as option set?
26
- # metadata.as?
27
- #
28
- # @return [ true, false ] True if an as exists, false if not.
29
- #
30
- # @since 2.0.0.rc.1
31
- def as?
32
- !!as
33
- end
34
-
35
- # Is the relation autobuilding if accessed via the getter and the
36
- # document is new.
37
- #
38
- # @example Is the relation autobuilding?
39
- # metadata.autobuilding?
40
- #
41
- # @return [ true, false ] If the relation autobuilds.
42
- #
43
- # @since 3.0.0
44
- def autobuilding?
45
- !!self[:autobuild]
46
- end
47
-
48
- # Returns the autosave option of the relation.
49
- #
50
- # @example Get the autosave option.
51
- # metadata.autosave
52
- #
53
- # @return [ true, false ] The autosave option.
54
- #
55
- # @since 2.1.0
56
- def autosave
57
- self[:autosave]
58
- end
59
-
60
- # Does the metadata have a autosave option?
61
- #
62
- # @example Is the relation autosaving?
63
- # metadata.autosave?
64
- #
65
- # @return [ true, false ] If the relation autosaves.
66
- #
67
- # @since 2.1.0
68
- def autosave?
69
- !!autosave
70
- end
71
-
72
- # Gets a relation builder associated with the relation this metadata is
73
- # for.
74
- #
75
- # @example Get the builder.
76
- # metadata.builder(document)
77
- #
78
- # @param [ Document ] base The base document.
79
- # @param [ Object ] object A document or attributes to give the builder.
80
- #
81
- # @return [ Builder ] The builder for the relation.
82
- #
83
- # @since 2.0.0.rc.1
84
- def builder(base, object)
85
- relation.builder(base, self, object)
86
- end
87
-
88
- # Returns the name of the strategy used for handling dependent relations.
89
- #
90
- # @example Get the strategy.
91
- # metadata.cascade_strategy
92
- #
93
- # @return [ Object ] The cascading strategy to use.
94
- #
95
- # @since 2.0.0.rc.1
96
- def cascade_strategy
97
- if dependent?
98
- "Mongoid::Relations::Cascading::#{dependent.to_s.classify}".constantize
99
- end
100
- end
101
-
102
- # Is this an embedded relations that allows callbacks to cascade down to
103
- # it?
104
- #
105
- # @example Does the relation have cascading callbacks?
106
- # metadata.cascading_callbacks?
107
- #
108
- # @return [ true, false ] If the relation cascades callbacks.
109
- #
110
- # @since 2.3.0
111
- def cascading_callbacks?
112
- !!self[:cascade_callbacks]
113
- end
114
-
115
- # Returns the name of the class that this relation contains. If the
116
- # class_name was provided as an option this will return that, otherwise
117
- # it will determine the name from the name property.
118
- #
119
- # @example Get the class name.
120
- # metadata.class_name
121
- #
122
- # @return [ String ] The name of the relation's proxied class.
123
- #
124
- # @since 2.0.0.rc.1
125
- def class_name
126
- @class_name ||= (self[:class_name] || classify).sub(/\A::/,"")
127
- end
128
-
129
- # Get the foreign key contraint for the metadata.
130
- #
131
- # @example Get the constaint.
132
- # metadata.constraint
133
- #
134
- # @return [ Constraint ] The constraint.
135
- #
136
- # @since 2.0.0.rc.1
137
- def constraint
138
- @constraint ||= Constraint.new(self)
139
- end
140
-
141
- # Does the metadata have a counter cache?
142
- #
143
- # @example Is the metadata counter_cached?
144
- # metadata.counter_cached?
145
- #
146
- # @return [ true, false ] If the metadata has counter_cache
147
- #
148
- # @since 3.1.0
149
- def counter_cached?
150
- !!self[:counter_cache]
151
- end
152
-
153
- # Returns the counter cache column name
154
- #
155
- # @example Get the counter cache column.
156
- # metadata.counter_cache_column_name
157
- #
158
- # @return [ String ] The counter cache column
159
- #
160
- # @since 3.1.0
161
- def counter_cache_column_name
162
- if self[:counter_cache] == true
163
- "#{inverse || inverse_class_name.demodulize.underscore.pluralize}_count"
164
- else
165
- self[:counter_cache].to_s
166
- end
167
- end
168
-
169
- # Get the criteria that is used to query for this metadata's relation.
170
- #
171
- # @example Get the criteria.
172
- # metadata.criteria([ id_one, id_two ], Person)
173
- #
174
- # @param [ Object ] object The foreign key used for the query.
175
- # @param [ Class ] type The base class.
176
- #
177
- # @return [ Criteria ] The criteria.
178
- #
179
- # @since 2.1.0
180
- def criteria(object, type)
181
- relation.criteria(self, object, type)
182
- end
183
-
184
- # Returns the cyclic option of the relation.
185
- #
186
- # @example Get the cyclic option.
187
- # metadata.cyclic
188
- #
189
- # @return [ true, false ] The cyclic option.
190
- #
191
- # @since 2.1.0
192
- def cyclic
193
- self[:cyclic]
194
- end
195
-
196
- # Does the metadata have a cyclic option?
197
- #
198
- # @example Is the metadata cyclic?
199
- # metadata.cyclic?
200
- #
201
- # @return [ true, false ] If the metadata is cyclic.
202
- #
203
- # @since 2.1.0
204
- def cyclic?
205
- !!cyclic
206
- end
207
-
208
- # Returns the dependent option of the relation.
209
- #
210
- # @example Get the dependent option.
211
- # metadata.dependent
212
- #
213
- # @return [ Symbol ] The dependent option.
214
- #
215
- # @since 2.1.0
216
- def dependent
217
- self[:dependent]
218
- end
219
-
220
- # Does the metadata have a dependent option?
221
- #
222
- # @example Is the metadata performing cascades?
223
- # metadata.dependent?
224
- #
225
- # @return [ true, false ] If the metadata cascades.
226
- #
227
- # @since 2.1.0
228
- def dependent?
229
- !!dependent
230
- end
231
-
232
- # Will determine if the relation is an embedded one or not. Currently
233
- # only checks against embeds one and many.
234
- #
235
- # @example Is the document embedded.
236
- # metadata.embedded?
237
- #
238
- # @return [ true, false ] True if embedded, false if not.
239
- #
240
- # @since 2.0.0.rc.1
241
- def embedded?
242
- @embedded ||= (macro == :embeds_one || macro == :embeds_many)
243
- end
244
-
245
- # Returns the extension of the relation.
246
- #
247
- # @example Get the relation extension.
248
- # metadata.extension
249
- #
250
- # @return [ Module ] The extension or nil.
251
- #
252
- # @since 2.0.0.rc.1
253
- def extension
254
- self[:extend]
255
- end
256
-
257
- # Tells whether an extension definition exist for this relation.
258
- #
259
- # @example Is an extension defined?
260
- # metadata.extension?
261
- #
262
- # @return [ true, false ] True if an extension exists, false if not.
263
- #
264
- # @since 2.0.0.rc.1
265
- def extension?
266
- !!extension
267
- end
268
-
269
- # Does this metadata have a forced nil inverse_of defined. (Used in many
270
- # to manies)
271
- #
272
- # @example Is this a forced nil inverse?
273
- # metadata.forced_nil_inverse?
274
- #
275
- # @return [ true, false ] If inverse_of has been explicitly set to nil.
276
- #
277
- # @since 2.3.3
278
- def forced_nil_inverse?
279
- @forced_nil_inverse ||= has_key?(:inverse_of) && inverse_of.nil?
280
- end
281
-
282
- # Handles all the logic for figuring out what the foreign_key is for each
283
- # relations query. The logic is as follows:
284
- #
285
- # 1. If the developer defined a custom key, use that.
286
- # 2. If the relation stores a foreign key,
287
- # use the class_name_id strategy.
288
- # 3. If the relation does not store the key,
289
- # use the inverse_class_name_id strategy.
290
- #
291
- # @example Get the foreign key.
292
- # metadata.foreign_key
293
- #
294
- # @return [ String ] The foreign key for the relation.
295
- #
296
- # @since 2.0.0.rc.1
297
- def foreign_key
298
- @foreign_key ||= determine_foreign_key
299
- end
300
-
301
- # Get the name of the method to check if the foreign key has changed.
302
- #
303
- # @example Get the foreign key check method.
304
- # metadata.foreign_key_check
305
- #
306
- # @return [ String ] The foreign key check.
307
- #
308
- # @since 2.1.0
309
- def foreign_key_check
310
- @foreign_key_check ||= "#{foreign_key}_changed?"
311
- end
312
-
313
- # Returns the name of the method used to set the foreign key on a
314
- # document.
315
- #
316
- # @example Get the setter for the foreign key.
317
- # metadata.foreign_key_setter
318
- #
319
- # @return [ String ] The foreign_key plus =.
320
- #
321
- # @since 2.0.0.rc.1
322
- def foreign_key_setter
323
- @foreign_key_setter ||= "#{foreign_key}="
324
- end
325
-
326
- # Returns the index option of the relation.
327
- #
328
- # @example Get the index option.
329
- # metadata.index
330
- #
331
- # @return [ true, false ] The index option.
332
- #
333
- # @since 2.1.0
334
- def index
335
- self[:index]
336
- end
337
-
338
- # Tells whether a foreign key index exists on the relation.
339
- #
340
- # @example Is the key indexed?
341
- # metadata.indexed?
342
- #
343
- # @return [ true, false ] True if an index exists, false if not.
344
- #
345
- # @since 2.0.0.rc.1
346
- def indexed?
347
- !!index
348
- end
349
-
350
- # Instantiate new metadata for a relation.
351
- #
352
- # @example Create the new metadata.
353
- # Metadata.new(:name => :addresses)
354
- #
355
- # @param [ Hash ] properties The relation options.
356
- #
357
- # @since 2.0.0.rc.1
358
- def initialize(properties = {})
359
- Options.validate!(properties)
360
- merge!(properties)
361
- end
362
-
363
- # Since a lot of the information from the metadata is inferred and not
364
- # explicitly stored in the hash, the inspection needs to be much more
365
- # detailed.
366
- #
367
- # @example Inspect the metadata.
368
- # metadata.inspect
369
- #
370
- # @return [ String ] Oodles of information in a nice format.
371
- #
372
- # @since 2.0.0.rc.1
373
- def inspect
374
- %Q{#<Mongoid::Relations::Metadata
375
- autobuild: #{autobuilding?}
376
- class_name: #{class_name}
377
- cyclic: #{cyclic.inspect}
378
- counter_cache:#{counter_cached?}
379
- dependent: #{dependent.inspect}
380
- inverse_of: #{inverse_of.inspect}
381
- key: #{key}
382
- macro: #{macro}
383
- name: #{name}
384
- order: #{order.inspect}
385
- polymorphic: #{polymorphic?}
386
- relation: #{relation}
387
- setter: #{setter}>
388
- }
389
- end
390
-
391
- # Get the name of the inverse relations if they exists. If this is a
392
- # polymorphic relation then just return the :as option that was defined.
393
- #
394
- # @example Get the names of the inverses.
395
- # metadata.inverses
396
- #
397
- # @param [ Document ] other The document to aid in the discovery.
398
- #
399
- # @return [ Array<Symbol> ] The inverse name.
400
- def inverses(other = nil)
401
- if self[:polymorphic]
402
- lookup_inverses(other)
403
- else
404
- @inverses ||= determine_inverses
405
- end
406
- end
407
-
408
- # Get the name of the inverse relation if it exists. If this is a
409
- # polymorphic relation then just return the :as option that was defined.
410
- #
411
- # @example Get the name of the inverse.
412
- # metadata.inverse
413
- #
414
- # @param [ Document ] other The document to aid in the discovery.
415
- #
416
- # @return [ Symbol ] The inverse name.
417
- #
418
- # @since 2.0.0.rc.1
419
- def inverse(other = nil)
420
- invs = inverses(other)
421
- invs.first if invs.count == 1
422
- end
423
-
424
- # Returns the inverse_class_name option of the relation.
425
- #
426
- # @example Get the inverse_class_name option.
427
- # metadata.inverse_class_name
428
- #
429
- # @return [ true, false ] The inverse_class_name option.
430
- #
431
- # @since 2.1.0
432
- def inverse_class_name
433
- self[:inverse_class_name]
434
- end
435
-
436
- # Returns the if the inverse class name option exists.
437
- #
438
- # @example Is an inverse class name defined?
439
- # metadata.inverse_class_name?
440
- #
441
- # @return [ true, false ] If the inverse if defined.
442
- #
443
- # @since 2.1.0
444
- def inverse_class_name?
445
- !!inverse_class_name
446
- end
447
-
448
- # Used for relational many to many only. This determines the name of the
449
- # foreign key field on the inverse side of the relation, since in this
450
- # case there are keys on both sides.
451
- #
452
- # @example Find the inverse foreign key
453
- # metadata.inverse_foreign_key
454
- #
455
- # @return [ String ] The foreign key on the inverse.
456
- #
457
- # @since 2.0.0.rc.1
458
- def inverse_foreign_key
459
- @inverse_foreign_key ||= determine_inverse_foreign_key
460
- end
461
-
462
- # Used for relational many to many only. This determines the name of the
463
- # foreign key field setter on the inverse side of the relation, since in this
464
- # case there are keys on both sides.
465
- #
466
- # @example Find the inverse foreign key setter.
467
- # metadata.inverse_foreign_key_setter
468
- #
469
- # @return [ String ] The foreign key setter on the inverse.
470
- #
471
- # @since 2.0.0.rc.1
472
- def inverse_foreign_key_setter
473
- @inverse_foreign_key_setter ||= "#{inverse_foreign_key}="
474
- end
475
-
476
- # Returns the inverse class of the proxied relation.
477
- #
478
- # @example Get the inverse class.
479
- # metadata.inverse_klass
480
- #
481
- # @return [ Class ] The class of the inverse of the relation.
482
- #
483
- # @since 2.0.0.rc.1
484
- def inverse_klass
485
- @inverse_klass ||= inverse_class_name.constantize
486
- end
487
-
488
- # Get the metadata for the inverse relation.
489
- #
490
- # @example Get the inverse metadata.
491
- # metadata.inverse_metadata(doc)
492
- #
493
- # @param [ Document, Class ] object The document or class.
494
- #
495
- # @return [ Metadata ] The inverse metadata.
496
- #
497
- # @since 2.1.0
498
- def inverse_metadata(object)
499
- object.reflect_on_association(inverse(object))
500
- end
501
-
502
- # Returns the inverse_of option of the relation.
503
- #
504
- # @example Get the inverse_of option.
505
- # metadata.inverse_of
506
- #
507
- # @return [ true, false ] The inverse_of option.
508
- #
509
- # @since 2.1.0
510
- def inverse_of
511
- self[:inverse_of]
512
- end
513
-
514
- # Does the metadata have a inverse_of option?
515
- #
516
- # @example Is an inverse_of defined?
517
- # metadata.inverse_of?
518
- #
519
- # @return [ true, false ] If the relation has an inverse_of defined.
520
- #
521
- # @since 2.1.0
522
- def inverse_of?
523
- !!inverse_of
524
- end
525
-
526
- # Returns the setter for the inverse side of the relation.
527
- #
528
- # @example Get the inverse setter.
529
- # metadata.inverse_setter
530
- #
531
- # @param [ Document ] other A document to aid in the discovery.
532
- #
533
- # @return [ String ] The inverse setter name.
534
- #
535
- # @since 2.0.0.rc.1
536
- def inverse_setter(other = nil)
537
- inverse(other).__setter__
538
- end
539
-
540
- # Returns the name of the field in which to store the name of the class
541
- # for the polymorphic relation.
542
- #
543
- # @example Get the name of the field.
544
- # metadata.inverse_type
545
- #
546
- # @return [ String ] The name of the field for storing the type.
547
- #
548
- # @since 2.0.0.rc.1
549
- def inverse_type
550
- @inverse_type ||= determine_inverse_for(:type)
551
- end
552
-
553
- # Gets the setter for the field that sets the type of document on a
554
- # polymorphic relation.
555
- #
556
- # @example Get the inverse type setter.
557
- # metadata.inverse_type_setter
558
- #
559
- # @return [ String ] The name of the setter.
560
- #
561
- # @since 2.0.0.rc.1
562
- def inverse_type_setter
563
- @inverse_type_setter ||= inverse_type.__setter__
564
- end
565
-
566
- # This returns the key that is to be used to grab the attributes for the
567
- # relation or the foreign key or id that a referenced relation will use
568
- # to query for the object.
569
- #
570
- # @example Get the lookup key.
571
- # metadata.key
572
- #
573
- # @return [ String ] The association name, foreign key name, or _id.
574
- #
575
- # @since 2.0.0.rc.1
576
- def key
577
- @key ||= determine_key
578
- end
579
-
580
- # Returns the class of the proxied relation.
581
- #
582
- # @example Get the class.
583
- # metadata.klass
584
- #
585
- # @return [ Class ] The class of the relation.
586
- #
587
- # @since 2.0.0.rc.1
588
- def klass
589
- @klass ||= class_name.constantize
590
- end
591
-
592
- # Is this metadata representing a one to many or many to many relation?
593
- #
594
- # @example Is the relation a many?
595
- # metadata.many?
596
- #
597
- # @return [ true, false ] If the relation is a many.
598
- #
599
- # @since 2.1.6
600
- def many?
601
- @many ||= (relation.macro.to_s =~ /many/)
602
- end
603
-
604
- # Returns the macro for the relation of this metadata.
605
- #
606
- # @example Get the macro.
607
- # metadata.macro
608
- #
609
- # @return [ Symbol ] The macro.
610
- #
611
- # @since 2.0.0.rc.1
612
- def macro
613
- relation.macro
614
- end
615
-
616
- # Get the name associated with this metadata.
617
- #
618
- # @example Get the name.
619
- # metadata.name
620
- #
621
- # @return [ Symbol ] The name.
622
- #
623
- # @since 2.1.0
624
- def name
625
- self[:name]
626
- end
627
-
628
- # Is the name defined?
629
- #
630
- # @example Is the name defined?
631
- # metadata.name?
632
- #
633
- # @return [ true, false ] If the name is defined.
634
- #
635
- # @since 2.1.0
636
- def name?
637
- !!name
638
- end
639
-
640
- # Does the relation have a destructive dependent option specified. This
641
- # is true for :dependent => :delete and :dependent => :destroy.
642
- #
643
- # @example Is the relation destructive?
644
- # metadata.destructive?
645
- #
646
- # @return [ true, false ] If the relation is destructive.
647
- #
648
- # @since 2.1.0
649
- def destructive?
650
- @destructive ||= (dependent == :delete || dependent == :destroy)
651
- end
652
-
653
- # Gets a relation nested builder associated with the relation this metadata
654
- # is for. Nested builders are used in conjunction with nested attributes.
655
- #
656
- # @example Get the nested builder.
657
- # metadata.nested_builder(attributes, options)
658
- #
659
- # @param [ Hash ] attributes The attributes to build the relation with.
660
- # @param [ Hash ] options Options for the nested builder.
661
- #
662
- # @return [ NestedBuilder ] The nested builder for the relation.
663
- #
664
- # @since 2.0.0.rc.1
665
- def nested_builder(attributes, options)
666
- if polymorphic? && options[:class_name]
667
- self[:class_name] = options[:class_name]
668
- end
669
- relation.nested_builder(self, attributes, options)
670
- end
671
-
672
- # Get the path calculator for the supplied document.
673
- #
674
- # @example Get the path calculator.
675
- # metadata.path(document)
676
- #
677
- # @param [ Document ] document The document to calculate on.
678
- #
679
- # @return [ Object ] The atomic path calculator.
680
- #
681
- # @since 2.1.0
682
- def path(document)
683
- relation.path(document)
684
- end
685
-
686
- # Returns true if the relation is polymorphic.
687
- #
688
- # @example Is the relation polymorphic?
689
- # metadata.polymorphic?
690
- #
691
- # @return [ true, false ] True if the relation is polymorphic, false if not.
692
- #
693
- # @since 2.0.0.rc.1
694
- def polymorphic?
695
- @polymorphic ||= (!!self[:as] || !!self[:polymorphic])
696
- end
697
-
698
- # Get the primary key field for finding the related document.
699
- #
700
- # @example Get the primary key.
701
- # metadata.primary_key
702
- #
703
- # @return [ String ] The primary key field.
704
- #
705
- # @since 3.1.0
706
- def primary_key
707
- @primary_key ||= (self[:primary_key] || "_id").to_s
708
- end
709
-
710
- # Get the relation associated with this metadata.
711
- #
712
- # @example Get the relation.
713
- # metadata.relation
714
- #
715
- # @return [ Proxy ] The relation proxy class.
716
- #
717
- # @since 2.1.0
718
- def relation
719
- self[:relation]
720
- end
721
-
722
- # Gets the method name used to set this relation.
723
- #
724
- # @example Get the setter.
725
- # metadata = Metadata.new(:name => :person)
726
- # metadata.setter # => "person="
727
- #
728
- # @return [ String ] The name plus "=".
729
- #
730
- # @since 2.0.0.rc.1
731
- def setter
732
- @setter ||= "#{name}="
733
- end
734
-
735
- # Returns the name of the field in which to store the name of the class
736
- # for the polymorphic relation.
737
- #
738
- # @example Get the name of the field.
739
- # metadata.inverse_type
740
- #
741
- # @return [ String ] The name of the field for storing the type.
742
- #
743
- # @since 2.0.0.rc.1
744
- def type
745
- @type ||= polymorphic? ? "#{as}_type" : nil
746
- end
747
-
748
- # Gets the setter for the field that sets the type of document on a
749
- # polymorphic relation.
750
- #
751
- # @example Get the inverse type setter.
752
- # metadata.inverse_type_setter
753
- #
754
- # @return [ String ] The name of the setter.
755
- #
756
- # @since 2.0.0.rc.1
757
- def type_setter
758
- @type_setter ||= type.__setter__
759
- end
760
-
761
-
762
- # Key where embedded document is save.
763
- # By default is the name of relation
764
- #
765
- # @return [ String ] the name of key where save
766
- #
767
- # @since 3.0.0
768
- def store_as
769
- @store_as ||= (self[:store_as].try(:to_s) || name.to_s)
770
- end
771
-
772
- # Are we validating this relation automatically?
773
- #
774
- # @example Is automatic validation on?
775
- # metadata.validate?
776
- #
777
- # @return [ true, false ] True unless explictly set to false.
778
- #
779
- # @since 2.0.0.rc.1
780
- def validate?
781
- if self[:validate].nil?
782
- self[:validate] = relation.validation_default
783
- else
784
- self[:validate]
785
- end
786
- end
787
-
788
- # Returns the metadata itself. Here for compatibility with Rails
789
- # association metadata.
790
- #
791
- # @example Get the options.
792
- # metadata.options
793
- #
794
- # @return [ Metadata ] self.
795
- #
796
- # @since 2.4.6
797
- def options
798
- self
799
- end
800
-
801
- # Returns default order for this association.
802
- #
803
- # @example Get default order
804
- # metadata.order
805
- #
806
- # @return [ Criterion::Complex, nil] nil if doesn't set
807
- #
808
- # @since 2.1.0
809
- def order
810
- self[:order]
811
- end
812
-
813
- # Is a default order set?
814
- #
815
- # @example Is the order set?
816
- # metadata.order?
817
- #
818
- # @return [ true, false ] If the order is set.
819
- #
820
- # @since 2.1.0
821
- def order?
822
- !!order
823
- end
824
-
825
- # Is this relation touchable?
826
- #
827
- # @example Is the relation touchable?
828
- # metadata.touchable?
829
- #
830
- # @return [ true, false ] If the relation can be touched.
831
- #
832
- # @since 3.0.0
833
- def touchable?
834
- !!self[:touch]
835
- end
836
-
837
- # Returns the metadata class types.
838
- #
839
- # @example Get the relation class types.
840
- # metadata.type_relation
841
- #
842
- # @return [ Hash ] The hash with relation class types.
843
- #
844
- # @since 3.1.0
845
- def type_relation
846
- { _type: { "$in" => klass._types }}
847
- end
848
-
849
- private
850
-
851
- # Returns the class name for the relation.
852
- #
853
- # @example Get the class name.
854
- # metadata.classify
855
- #
856
- # @return [ String ] The classified name.
857
- #
858
- # @since 2.0.0.rc.1
859
- def classify
860
- @classify ||= "#{find_module}::#{name.to_s.classify}"
861
- end
862
-
863
- # Get the name for the inverse field.
864
- #
865
- # @api private
866
- #
867
- # @example Get the inverse field name.
868
- # metadata.determine_inverse_for(:type)
869
- #
870
- # @param [ Symbol ] field The inverse field name.
871
- #
872
- # @return [ String ] The name of the field.
873
- #
874
- # @since 3.0.0
875
- def determine_inverse_for(field)
876
- relation.stores_foreign_key? && polymorphic? ? "#{name}_#{field}" : nil
877
- end
878
-
879
- # Deterimene the inverses that can be memoized.
880
- #
881
- # @api private
882
- #
883
- # @example Determin the inverses.
884
- # metadata.determine_inverses
885
- #
886
- # @return [ Array<Symbol> ] The inverses.
887
- #
888
- # @since 3.0.0
889
- def determine_inverses
890
- return [ inverse_of ] if has_key?(:inverse_of)
891
- return [ as ] if has_key?(:as)
892
- return [ cyclic_inverse ] if self[:cyclic]
893
- [ inverse_relation ]
894
- end
895
-
896
- # Find the module the class with the specific name is in.
897
- # This is done by starting at the inverse_class_name's
898
- # module and stepping down to see where it is defined.
899
- #
900
- # @api private
901
- #
902
- # @example Find the module.
903
- # metadata.find_module
904
- #
905
- # @return [ String ] The module.
906
- #
907
- # @since 3.0.0
908
- def find_module
909
- if inverse_class_name.present?
910
- parts = inverse_class_name.split('::')
911
- modules = parts.size.times.map { |i| parts.first(i).join('::') }.reverse
912
- find_from_parts(modules)
913
- end
914
- end
915
-
916
- # Find the modules from a reversed list.
917
- #
918
- # @api private
919
- #
920
- # @example Find the module from the parts.
921
- # metadata.find_from_parts([ "Namespace", "Module" ])
922
- #
923
- # @param [ Array<String> ] modules The modules.
924
- #
925
- # @return [ String ] The matching module.
926
- #
927
- # @since 3.0.0
928
- def find_from_parts(modules)
929
- modules.find do |mod|
930
- if mod.blank?
931
- false
932
- else
933
- ActiveSupport::Inflector.constantize(mod).constants.include?(
934
- name.to_s.classify.to_sym
935
- )
936
- end
937
- end
938
- end
939
-
940
- # Get the name of the inverse relation in a cyclic relation.
941
- #
942
- # @example Get the cyclic inverse name.
943
- #
944
- # class Role
945
- # include Mongoid::Document
946
- # embedded_in :parent_role, :cyclic => true
947
- # embeds_many :child_roles, :cyclic => true
948
- # end
949
- #
950
- # metadata = Metadata.new(:name => :parent_role)
951
- # metadata.cyclic_inverse # => "child_roles"
952
- #
953
- # @return [ String ] The cyclic inverse name.
954
- #
955
- # @since 2.0.0.rc.1
956
- def cyclic_inverse
957
- @cyclic_inverse ||= determine_cyclic_inverse
958
- end
959
-
960
- # Determine the cyclic inverse. Performance improvement with the
961
- # memoization.
962
- #
963
- # @example Determine the inverse.
964
- # metadata.determine_cyclic_inverse
965
- #
966
- # @return [ String ] The cyclic inverse name.
967
- #
968
- # @since 2.0.0.rc.1
969
- def determine_cyclic_inverse
970
- underscored = class_name.demodulize.underscore
971
- klass.relations.each_pair do |key, meta|
972
- if key =~ /#{underscored.singularize}|#{underscored.pluralize}/ &&
973
- meta.relation != relation
974
- return key.to_sym
975
- end
976
- end
977
- end
978
-
979
- # Determine the value for the relation's foreign key. Performance
980
- # improvement.
981
- #
982
- # @example Determine the foreign key.
983
- # metadata.determine_foreign_key
984
- #
985
- # @return [ String ] The foreign key.
986
- #
987
- # @since 2.0.0.rc.1
988
- def determine_foreign_key
989
- return self[:foreign_key].to_s if self[:foreign_key]
990
- return nil if relation.embedded?
991
-
992
- if relation.stores_foreign_key?
993
- relation.foreign_key(name)
994
- else
995
- suffix = relation.foreign_key_suffix
996
- "#{inverse}#{suffix}"
997
- end
998
- end
999
-
1000
- # Determine the inverse foreign key of the relation.
1001
- #
1002
- # @example Determine the inverse foreign key.
1003
- # metadata.determine_inverse_foreign_key
1004
- #
1005
- # @return [ String ] The inverse.
1006
- #
1007
- # @since 2.3.2
1008
- def determine_inverse_foreign_key
1009
- if has_key?(:inverse_of)
1010
- inverse_of ? "#{inverse_of.to_s.singularize}#{relation.foreign_key_suffix}" : nil
1011
- else
1012
- "#{inverse_class_name.demodulize.underscore}#{relation.foreign_key_suffix}"
1013
- end
1014
- end
1015
-
1016
- # Determine the inverse relation. Memoizing #inverse_relation and adding
1017
- # this method dropped 5 seconds off the test suite as a performance
1018
- # improvement.
1019
- #
1020
- # @example Determine the inverse.
1021
- # metadata.determine_inverse_relation
1022
- #
1023
- # @return [ Symbol ] The name of the inverse.
1024
- #
1025
- # @since 2.0.0.rc.1
1026
- def determine_inverse_relation
1027
- default = foreign_key_match || klass.relations[inverse_klass.name.underscore]
1028
- return default.name if default
1029
- names = inverse_relation_candidate_names
1030
- if names.size > 1
1031
- raise Errors::AmbiguousRelationship.new(klass, inverse_klass, name, names)
1032
- end
1033
- names.first
1034
- end
1035
-
1036
- # Return metadata where the foreign key matches the foreign key on this
1037
- # relation.
1038
- #
1039
- # @api private
1040
- #
1041
- # @example Return a foreign key match.
1042
- # meta.foreign_key_match
1043
- #
1044
- # @return [ Metadata ] A match, if any.
1045
- #
1046
- # @since 2.4.11
1047
- def foreign_key_match
1048
- if fk = self[:foreign_key]
1049
- relations_metadata.detect do |meta|
1050
- fk == meta.foreign_key if meta.stores_foreign_key?
1051
- end
1052
- end
1053
- end
1054
-
1055
- # Get the inverse relation candidates.
1056
- #
1057
- # @api private
1058
- #
1059
- # @example Get the inverse relation candidates.
1060
- # metadata.inverse_relation_candidates
1061
- #
1062
- # @return [ Array<Metdata> ] The candidates.
1063
- #
1064
- # @since 3.0.0
1065
- def inverse_relation_candidates
1066
- relations_metadata.select do |meta|
1067
- next if meta.name == name
1068
- (meta.class_name == inverse_class_name) && !meta.forced_nil_inverse?
1069
- end
1070
- end
1071
-
1072
- # Get the candidates for inverse relations.
1073
- #
1074
- # @api private
1075
- #
1076
- # @example Get the candidates.
1077
- # metadata.inverse_relation_candidates
1078
- #
1079
- # @return [ Array<Symbol> ] The candidates.
1080
- #
1081
- # @since 3.0.0
1082
- def inverse_relation_candidate_names
1083
- @candidate_names ||= inverse_relation_candidates.map(&:name)
1084
- end
1085
-
1086
- # Determine the key for the relation in the attributes.
1087
- #
1088
- # @example Get the key.
1089
- # metadata.determine_key
1090
- #
1091
- # @return [ String ] The key in the attributes.
1092
- #
1093
- # @since 2.0.0.rc.1
1094
- def determine_key
1095
- return store_as.to_s if relation.embedded?
1096
- relation.stores_foreign_key? ? foreign_key : primary_key
1097
- end
1098
-
1099
- # Determine the name of the inverse relation.
1100
- #
1101
- # @example Get the inverse name.
1102
- # metadata.inverse_relation
1103
- #
1104
- # @return [ Symbol ] The name of the inverse relation.
1105
- #
1106
- # @since 2.0.0.rc.1
1107
- def inverse_relation
1108
- @inverse_relation ||= determine_inverse_relation
1109
- end
1110
-
1111
- # Infer the name of the inverse relation from the class.
1112
- #
1113
- # @example Get the inverse name
1114
- # metadata.inverse_name
1115
- #
1116
- # @return [ String ] The inverse class name underscored.
1117
- #
1118
- # @since 2.0.0.rc.1
1119
- def inverse_name
1120
- @inverse_name ||= inverse_klass.name.underscore
1121
- end
1122
-
1123
- # For polymorphic children, we need to figure out the inverse from the
1124
- # actual instance on the other side, since we cannot know the exact class
1125
- # name to infer it from at load time.
1126
- #
1127
- # @example Find the inverses.
1128
- # metadata.lookup_inverses(other)
1129
- #
1130
- # @param [ Document ] other The inverse document.
1131
- #
1132
- # @return [ Array<String> ] The inverse names.
1133
- def lookup_inverses(other)
1134
- return [ inverse_of ] if inverse_of
1135
- if other
1136
- matches = []
1137
- other.class.relations.values.each do |meta|
1138
- if meta.as == name && meta.class_name == inverse_class_name
1139
- matches.push(meta.name)
1140
- end
1141
- end
1142
- matches
1143
- end
1144
- end
1145
-
1146
- # For polymorphic children, we need to figure out the inverse from the
1147
- # actual instance on the other side, since we cannot know the exact class
1148
- # name to infer it from at load time.
1149
- #
1150
- # @example Find the inverse.
1151
- # metadata.lookup_inverse(other)
1152
- #
1153
- # @param [ Document ] other The inverse document.
1154
- #
1155
- # @return [ String ] The inverse name.
1156
- #
1157
- # @since 2.0.0.rc.1
1158
- def lookup_inverse(other)
1159
- if invs = lookup_inverses(other) && invs.count == 1
1160
- invs.first
1161
- end
1162
- end
1163
-
1164
- # Get the relation metadata only.
1165
- #
1166
- # @api private
1167
- #
1168
- # @example Get the relation metadata.
1169
- # metadata.relations_metadata
1170
- #
1171
- # @return [ Array<Metadata> ] The metadata.
1172
- #
1173
- # @since 3.0.0
1174
- def relations_metadata
1175
- klass.relations.values
1176
- end
1177
- end
1178
- end
1179
- end