mongoid 2.8.1 → 3.0.0.rc

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 (351) hide show
  1. data/CHANGELOG.md +802 -58
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -8
  5. data/lib/config/locales/en.yml +441 -51
  6. data/lib/mongoid.rb +24 -39
  7. data/lib/mongoid/atomic.rb +16 -33
  8. data/lib/mongoid/atomic/modifiers.rb +2 -2
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  11. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  12. data/lib/mongoid/atomic/paths/root.rb +4 -5
  13. data/lib/mongoid/attributes.rb +95 -32
  14. data/lib/mongoid/attributes/processing.rb +14 -10
  15. data/lib/mongoid/attributes/readonly.rb +56 -0
  16. data/lib/mongoid/callbacks.rb +90 -27
  17. data/lib/mongoid/collections/retry.rb +2 -3
  18. data/lib/mongoid/components.rb +11 -23
  19. data/lib/mongoid/config.rb +87 -233
  20. data/lib/mongoid/config/environment.rb +5 -6
  21. data/lib/mongoid/config/inflections.rb +6 -0
  22. data/lib/mongoid/config/options.rb +1 -1
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config/validators/option.rb +25 -0
  25. data/lib/mongoid/config/validators/session.rb +140 -0
  26. data/lib/mongoid/contextual.rb +50 -0
  27. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  28. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  29. data/lib/mongoid/contextual/atomic.rb +179 -0
  30. data/lib/mongoid/contextual/command.rb +43 -0
  31. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  32. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  33. data/lib/mongoid/contextual/memory.rb +383 -0
  34. data/lib/mongoid/contextual/mongo.rb +543 -0
  35. data/lib/mongoid/copyable.rb +3 -34
  36. data/lib/mongoid/criteria.rb +436 -250
  37. data/lib/mongoid/criterion/inspection.rb +14 -8
  38. data/lib/mongoid/criterion/scoping.rb +114 -44
  39. data/lib/mongoid/dirty.rb +152 -67
  40. data/lib/mongoid/document.rb +69 -50
  41. data/lib/mongoid/errors.rb +22 -1
  42. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  43. data/lib/mongoid/errors/callback.rb +5 -6
  44. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  45. data/lib/mongoid/errors/document_not_found.rb +98 -17
  46. data/lib/mongoid/errors/eager_load.rb +3 -6
  47. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  48. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  49. data/lib/mongoid/errors/invalid_database.rb +3 -3
  50. data/lib/mongoid/errors/invalid_field.rb +54 -8
  51. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  52. data/lib/mongoid/errors/invalid_find.rb +3 -3
  53. data/lib/mongoid/errors/invalid_index.rb +28 -0
  54. data/lib/mongoid/errors/invalid_options.rb +4 -4
  55. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  56. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  57. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  58. data/lib/mongoid/errors/invalid_time.rb +3 -6
  59. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  60. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  61. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  62. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  63. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  64. data/lib/mongoid/errors/no_default_session.rb +23 -0
  65. data/lib/mongoid/errors/no_environment.rb +3 -3
  66. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  67. data/lib/mongoid/errors/no_parent.rb +24 -0
  68. data/lib/mongoid/errors/no_session_config.rb +22 -0
  69. data/lib/mongoid/errors/no_session_database.rb +27 -0
  70. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  71. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  72. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  73. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  74. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  75. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  76. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  77. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  78. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  79. data/lib/mongoid/errors/validations.rb +7 -6
  80. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  81. data/lib/mongoid/extensions.rb +28 -76
  82. data/lib/mongoid/extensions/array.rb +127 -0
  83. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  84. data/lib/mongoid/extensions/boolean.rb +24 -0
  85. data/lib/mongoid/extensions/date.rb +70 -0
  86. data/lib/mongoid/extensions/date_time.rb +68 -0
  87. data/lib/mongoid/extensions/false_class.rb +26 -0
  88. data/lib/mongoid/extensions/float.rb +44 -0
  89. data/lib/mongoid/extensions/hash.rb +91 -0
  90. data/lib/mongoid/extensions/integer.rb +54 -0
  91. data/lib/mongoid/extensions/module.rb +28 -0
  92. data/lib/mongoid/extensions/nil_class.rb +21 -0
  93. data/lib/mongoid/extensions/object.rb +188 -0
  94. data/lib/mongoid/extensions/object_id.rb +53 -0
  95. data/lib/mongoid/extensions/range.rb +55 -0
  96. data/lib/mongoid/extensions/regexp.rb +27 -0
  97. data/lib/mongoid/extensions/set.rb +55 -0
  98. data/lib/mongoid/extensions/string.rb +155 -0
  99. data/lib/mongoid/extensions/symbol.rb +54 -0
  100. data/lib/mongoid/extensions/time.rb +78 -0
  101. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  102. data/lib/mongoid/extensions/true_class.rb +26 -0
  103. data/lib/mongoid/factory.rb +1 -1
  104. data/lib/mongoid/fields.rb +129 -194
  105. data/lib/mongoid/fields/foreign_key.rb +134 -0
  106. data/lib/mongoid/fields/localized.rb +73 -0
  107. data/lib/mongoid/fields/standard.rb +268 -0
  108. data/lib/mongoid/fields/validators.rb +2 -0
  109. data/lib/mongoid/fields/validators/macro.rb +83 -0
  110. data/lib/mongoid/finders.rb +42 -43
  111. data/lib/mongoid/hierarchy.rb +25 -14
  112. data/lib/mongoid/identity_map.rb +31 -19
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/indexes/validators/options.rb +80 -0
  115. data/lib/mongoid/inspection.rb +1 -1
  116. data/lib/mongoid/javascript.rb +1 -1
  117. data/lib/mongoid/json.rb +2 -2
  118. data/lib/mongoid/loggable.rb +69 -0
  119. data/lib/mongoid/matchers.rb +1 -1
  120. data/lib/mongoid/matchers/all.rb +7 -8
  121. data/lib/mongoid/matchers/and.rb +3 -3
  122. data/lib/mongoid/matchers/default.rb +6 -4
  123. data/lib/mongoid/matchers/exists.rb +2 -2
  124. data/lib/mongoid/matchers/gt.rb +2 -2
  125. data/lib/mongoid/matchers/gte.rb +2 -2
  126. data/lib/mongoid/matchers/in.rb +3 -7
  127. data/lib/mongoid/matchers/lt.rb +2 -2
  128. data/lib/mongoid/matchers/lte.rb +2 -2
  129. data/lib/mongoid/matchers/ne.rb +2 -2
  130. data/lib/mongoid/matchers/nin.rb +2 -2
  131. data/lib/mongoid/matchers/or.rb +2 -2
  132. data/lib/mongoid/matchers/size.rb +2 -2
  133. data/lib/mongoid/matchers/strategies.rb +3 -3
  134. data/lib/mongoid/multi_parameter_attributes.rb +8 -10
  135. data/lib/mongoid/nested_attributes.rb +17 -9
  136. data/lib/mongoid/observer.rb +1 -2
  137. data/lib/mongoid/paranoia.rb +13 -18
  138. data/lib/mongoid/persistence.rb +43 -39
  139. data/lib/mongoid/persistence/atomic.rb +2 -2
  140. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  141. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  144. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  145. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  146. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  147. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  148. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  149. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  150. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  151. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  152. data/lib/mongoid/persistence/deletion.rb +2 -2
  153. data/lib/mongoid/persistence/insertion.rb +10 -16
  154. data/lib/mongoid/persistence/modification.rb +5 -9
  155. data/lib/mongoid/persistence/operations.rb +6 -19
  156. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  157. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  158. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  159. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  160. data/lib/mongoid/persistence/operations/update.rb +5 -5
  161. data/lib/mongoid/railtie.rb +26 -11
  162. data/lib/mongoid/railties/database.rake +22 -108
  163. data/lib/mongoid/relations.rb +4 -6
  164. data/lib/mongoid/relations/accessors.rb +119 -19
  165. data/lib/mongoid/relations/auto_save.rb +59 -5
  166. data/lib/mongoid/relations/binding.rb +211 -2
  167. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  168. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  169. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  170. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  171. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  172. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  173. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  174. data/lib/mongoid/relations/builder.rb +3 -3
  175. data/lib/mongoid/relations/builders.rb +19 -16
  176. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  177. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  178. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  179. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  180. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  181. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  182. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  183. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  184. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  185. data/lib/mongoid/relations/cascading.rb +6 -4
  186. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  187. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  188. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  189. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  190. data/lib/mongoid/relations/constraint.rb +4 -3
  191. data/lib/mongoid/relations/conversions.rb +5 -6
  192. data/lib/mongoid/relations/cyclic.rb +7 -7
  193. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  194. data/lib/mongoid/relations/embedded/in.rb +23 -12
  195. data/lib/mongoid/relations/embedded/many.rb +99 -161
  196. data/lib/mongoid/relations/embedded/one.rb +25 -14
  197. data/lib/mongoid/relations/macros.rb +105 -61
  198. data/lib/mongoid/relations/many.rb +93 -14
  199. data/lib/mongoid/relations/metadata.rb +200 -45
  200. data/lib/mongoid/relations/nested_builder.rb +3 -5
  201. data/lib/mongoid/relations/one.rb +2 -2
  202. data/lib/mongoid/relations/options.rb +2 -2
  203. data/lib/mongoid/relations/polymorphic.rb +9 -9
  204. data/lib/mongoid/relations/proxy.rb +60 -31
  205. data/lib/mongoid/relations/referenced/in.rb +40 -15
  206. data/lib/mongoid/relations/referenced/many.rb +117 -132
  207. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  208. data/lib/mongoid/relations/referenced/one.rb +34 -13
  209. data/lib/mongoid/relations/reflections.rb +3 -3
  210. data/lib/mongoid/relations/synchronization.rb +19 -23
  211. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  212. data/lib/mongoid/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +8 -27
  215. data/lib/mongoid/sessions.rb +359 -0
  216. data/lib/mongoid/sessions/factory.rb +106 -0
  217. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded.rb +167 -59
  223. data/lib/mongoid/threaded/lifecycle.rb +21 -22
  224. data/lib/mongoid/threaded/sessions.rb +0 -0
  225. data/lib/mongoid/timestamps.rb +1 -1
  226. data/lib/mongoid/timestamps/created.rb +8 -4
  227. data/lib/mongoid/timestamps/timeless.rb +6 -4
  228. data/lib/mongoid/timestamps/updated.rb +3 -3
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations.rb +27 -19
  231. data/lib/mongoid/validations/associated.rb +2 -2
  232. data/lib/mongoid/validations/format.rb +2 -2
  233. data/lib/mongoid/validations/presence.rb +31 -5
  234. data/lib/mongoid/validations/uniqueness.rb +9 -12
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  238. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  239. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  240. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  241. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  242. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  243. data/lib/rails/generators/mongoid_generator.rb +5 -5
  244. data/lib/rails/mongoid.rb +69 -25
  245. metadata +110 -137
  246. checksums.yaml +0 -7
  247. data/lib/config/locales/bg.yml +0 -61
  248. data/lib/config/locales/de.yml +0 -61
  249. data/lib/config/locales/en-GB.yml +0 -64
  250. data/lib/config/locales/es.yml +0 -59
  251. data/lib/config/locales/fr.yml +0 -62
  252. data/lib/config/locales/hi.yml +0 -53
  253. data/lib/config/locales/hu.yml +0 -64
  254. data/lib/config/locales/id.yml +0 -62
  255. data/lib/config/locales/it.yml +0 -59
  256. data/lib/config/locales/ja.yml +0 -57
  257. data/lib/config/locales/kr.yml +0 -54
  258. data/lib/config/locales/nl.yml +0 -61
  259. data/lib/config/locales/pl.yml +0 -59
  260. data/lib/config/locales/pt-BR.yml +0 -60
  261. data/lib/config/locales/pt.yml +0 -60
  262. data/lib/config/locales/ro.yml +0 -66
  263. data/lib/config/locales/ru.yml +0 -61
  264. data/lib/config/locales/sv.yml +0 -60
  265. data/lib/config/locales/vi.yml +0 -62
  266. data/lib/config/locales/zh-CN.yml +0 -53
  267. data/lib/mongoid/collection.rb +0 -157
  268. data/lib/mongoid/collections.rb +0 -120
  269. data/lib/mongoid/collections/master.rb +0 -45
  270. data/lib/mongoid/collections/operations.rb +0 -44
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts.rb +0 -25
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  276. data/lib/mongoid/contexts/mongo.rb +0 -487
  277. data/lib/mongoid/criterion/builder.rb +0 -34
  278. data/lib/mongoid/criterion/complex.rb +0 -84
  279. data/lib/mongoid/criterion/creational.rb +0 -34
  280. data/lib/mongoid/criterion/exclusion.rb +0 -110
  281. data/lib/mongoid/criterion/inclusion.rb +0 -290
  282. data/lib/mongoid/criterion/optional.rb +0 -259
  283. data/lib/mongoid/criterion/selector.rb +0 -177
  284. data/lib/mongoid/cursor.rb +0 -88
  285. data/lib/mongoid/default_scope.rb +0 -36
  286. data/lib/mongoid/errors/invalid_type.rb +0 -25
  287. data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
  288. data/lib/mongoid/extensions/array/deletion.rb +0 -29
  289. data/lib/mongoid/extensions/false_class/equality.rb +0 -26
  290. data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
  291. data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
  292. data/lib/mongoid/extensions/hash/scoping.rb +0 -25
  293. data/lib/mongoid/extensions/integer/checks.rb +0 -23
  294. data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
  295. data/lib/mongoid/extensions/object/checks.rb +0 -29
  296. data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
  297. data/lib/mongoid/extensions/object/reflections.rb +0 -48
  298. data/lib/mongoid/extensions/object/substitutable.rb +0 -15
  299. data/lib/mongoid/extensions/object/yoda.rb +0 -44
  300. data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
  301. data/lib/mongoid/extensions/proc/scoping.rb +0 -25
  302. data/lib/mongoid/extensions/string/checks.rb +0 -36
  303. data/lib/mongoid/extensions/string/conversions.rb +0 -22
  304. data/lib/mongoid/extensions/string/inflections.rb +0 -118
  305. data/lib/mongoid/extensions/symbol/checks.rb +0 -23
  306. data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
  307. data/lib/mongoid/extensions/true_class/equality.rb +0 -26
  308. data/lib/mongoid/extras.rb +0 -31
  309. data/lib/mongoid/fields/internal/array.rb +0 -77
  310. data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
  311. data/lib/mongoid/fields/internal/bignum.rb +0 -10
  312. data/lib/mongoid/fields/internal/binary.rb +0 -11
  313. data/lib/mongoid/fields/internal/boolean.rb +0 -58
  314. data/lib/mongoid/fields/internal/date.rb +0 -51
  315. data/lib/mongoid/fields/internal/date_time.rb +0 -28
  316. data/lib/mongoid/fields/internal/false_class.rb +0 -10
  317. data/lib/mongoid/fields/internal/fixnum.rb +0 -10
  318. data/lib/mongoid/fields/internal/float.rb +0 -47
  319. data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
  320. data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
  321. data/lib/mongoid/fields/internal/hash.rb +0 -11
  322. data/lib/mongoid/fields/internal/integer.rb +0 -59
  323. data/lib/mongoid/fields/internal/localized.rb +0 -62
  324. data/lib/mongoid/fields/internal/nil_class.rb +0 -53
  325. data/lib/mongoid/fields/internal/object.rb +0 -11
  326. data/lib/mongoid/fields/internal/object_id.rb +0 -46
  327. data/lib/mongoid/fields/internal/range.rb +0 -61
  328. data/lib/mongoid/fields/internal/set.rb +0 -57
  329. data/lib/mongoid/fields/internal/string.rb +0 -42
  330. data/lib/mongoid/fields/internal/symbol.rb +0 -43
  331. data/lib/mongoid/fields/internal/time.rb +0 -23
  332. data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
  333. data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
  334. data/lib/mongoid/fields/internal/true_class.rb +0 -10
  335. data/lib/mongoid/fields/mappings.rb +0 -42
  336. data/lib/mongoid/fields/serializable.rb +0 -270
  337. data/lib/mongoid/identity.rb +0 -92
  338. data/lib/mongoid/keys.rb +0 -144
  339. data/lib/mongoid/logger.rb +0 -45
  340. data/lib/mongoid/multi_database.rb +0 -36
  341. data/lib/mongoid/named_scope.rb +0 -166
  342. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  343. data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
  344. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  345. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  346. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  347. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  348. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  349. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -1,92 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
- class Identity #:nodoc:
4
-
5
- attr_reader :document
6
-
7
- # Create the identity for the document. The id will be set in either in
8
- # the form of a Mongo object id or a composite key set up by defining
9
- # a key on the document. The _type will be set to the document's class
10
- # name.
11
- #
12
- # @example Create the id and set the type.
13
- # identity.create
14
- def create
15
- identify.tap { type }
16
- end
17
-
18
- # Create the new identity generator - this will be expanded in the future
19
- # to support pk generators.
20
- #
21
- # @example
22
- # Identity.new(document)
23
- #
24
- # @param [ Document ] document The document to generate an id for.
25
- #
26
- # @return [ Identity ] The new identity object.
27
- def initialize(document)
28
- @document = document
29
- end
30
-
31
- private
32
-
33
- # Return the proper id for the document. Will be an object id or its string
34
- # representation depending on the configuration.
35
- #
36
- # @example Generate the id.
37
- # identity.generate_id
38
- #
39
- # @return [ Object ] The bson object id or its string equivalent.
40
- def generate_id
41
- id = BSON::ObjectId.new
42
- document.using_object_ids? ? id : id.to_s
43
- end
44
-
45
- # Sets the id on the document. Will either set a newly generated id or
46
- # build the composite key.
47
- #
48
- # @example Set the id.
49
- # identity.identify
50
- def identify
51
- document.id = compose.join(" ").identify if document.primary_key
52
- document.id = generate_id if document.id.blank?
53
- document.id
54
- end
55
-
56
- # Set the _type field on the document if the document is hereditary or in a
57
- # polymorphic relation.
58
- #
59
- # @example Set the type.
60
- # identity.type
61
- def type
62
- document._type = document.class.name if typed?
63
- end
64
-
65
- # Generates the array of keys to build the id.
66
- #
67
- # @example Build the array for the keys.
68
- # identity.compose.
69
- #
70
- # @return [ Array<Object> ] The array of keys.
71
- def compose
72
- kf = document.key_formatter
73
- document.primary_key.collect do |key|
74
- val = document.attributes[key.to_s]
75
- val && kf ? kf.call(val) : val
76
- end.compact
77
- end
78
-
79
- # Determines if the document stores the type information. This is if it is
80
- # in a hierarchy, has subclasses, or is in a polymorphic relation.
81
- #
82
- # @example Check if the document is typed.
83
- # identity.typed?
84
- #
85
- # @return [ true, false ] True if typed, false if not.
86
- def typed?
87
- document.hereditary? ||
88
- document.class.descendants.any? ||
89
- document.polymorphic?
90
- end
91
- end
92
- end
@@ -1,144 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
-
4
- # This module defines the behaviour for overriding the default ids on
5
- # documents.
6
- module Keys
7
- extend ActiveSupport::Concern
8
-
9
- attr_reader :identifier
10
-
11
- included do
12
- cattr_accessor :primary_key, :using_object_ids, :key_formatter
13
- self.using_object_ids = true
14
- end
15
-
16
- # Get the document's primary key.
17
- #
18
- # @note Refactored from using delegate for class load performance.
19
- #
20
- # @example Get the primary key.
21
- # model.primary_key
22
- #
23
- # @return [ Array ] The primary key
24
- def primary_key
25
- self.class.primary_key
26
- end
27
-
28
- # Is the document using object ids?
29
- #
30
- # @note Refactored from using delegate for class load performance.
31
- #
32
- # @example Is the document using object ids?
33
- # model.using_object_ids?
34
- #
35
- # @return [ true, false ] Using object ids.
36
- def using_object_ids?
37
- self.class.using_object_ids?
38
- end
39
-
40
- private
41
-
42
- # Determines if any field that the document id is composed of has changed.
43
- #
44
- # @example Has any key field changed?
45
- # document.key_field_changed?
46
- #
47
- # @return [ true, false ] Has a key field changed?
48
- #
49
- # @since 2.0.0
50
- def key_field_changed?
51
- primary_key.any? { |field| changed.include?(field.to_s) }
52
- end
53
-
54
- # Sits around a save when composite keys are in play to handle the id magic
55
- # if a key field has changed.
56
- #
57
- # @example Set the composite key.
58
- # document.set_composite_key
59
- #
60
- # @param [ Proc ] block The block this surrounds.
61
- #
62
- # @since 2.0.0
63
- def set_composite_key(&block)
64
- if persisted? && key_field_changed?
65
- swap_composite_keys(&block)
66
- else
67
- identify and block.call
68
- end
69
- end
70
-
71
- # Swap out the composite key only after the document has been saved.
72
- #
73
- # @example Swap out the keys.
74
- # document.swap_composite_keys
75
- #
76
- # @param [ Proc ] block The save block getting called.
77
- #
78
- # @since 2.0.0
79
- def swap_composite_keys(&block)
80
- @identifier, new_id = id.dup, identify
81
- block.call
82
- @identifier = nil
83
- end
84
-
85
- module ClassMethods #:nodoc:
86
-
87
- # Used for telling Mongoid on a per model basis whether to override the
88
- # default +BSON::ObjectId+ and use a different type. This will be
89
- # expanded in the future for requiring a PkFactory if the type is not a
90
- # +BSON::ObjectId+ or +String+.
91
- #
92
- # @example Change the documents key type.
93
- # class Person
94
- # include Mongoid::Document
95
- # identity :type => String
96
- # end
97
- #
98
- # @param [ Hash ] options The options.
99
- #
100
- # @option options [ Class ] :type The type of the id.
101
- #
102
- # @since 2.0.0.beta.1
103
- def identity(options = {})
104
- type = options[:type]
105
- replace_field("_id", type)
106
- self.using_object_ids = (type == BSON::ObjectId)
107
- end
108
-
109
- # Defines the field that will be used for the id of this +Document+. This
110
- # set the id of this +Document+ before save to a parameterized version of
111
- # the field that was supplied. This is good for use for readable URLS in
112
- # web applications.
113
- #
114
- # @example Create a composite id.
115
- # class Person
116
- # include Mongoid::Document
117
- # key :first_name, :last_name
118
- # end
119
- #
120
- # @param [ Array<Symbol> ] The fields the key is composed of.
121
- #
122
- # @since 1.0.0
123
- def key(*fields)
124
- self.primary_key = fields
125
- self.key_formatter = block_given? ? Proc.new : nil
126
- identity(:type => String)
127
- set_callback(:save, :around, :set_composite_key)
128
- end
129
-
130
- # Convenience method for determining if we are using +BSON::ObjectIds+ as
131
- # our id.
132
- #
133
- # @example Does this class use object ids?
134
- # person.using_object_ids?
135
- #
136
- # @return [ true, false ] If the class uses BSON::ObjectIds for the id.
137
- #
138
- # @since 1.0.0
139
- def using_object_ids?
140
- using_object_ids
141
- end
142
- end
143
- end
144
- end
@@ -1,45 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
-
4
- # The Mongoid logger which wraps some other ruby compliant logger class.
5
- class Logger
6
-
7
- delegate \
8
- :info,
9
- :debug,
10
- :error,
11
- :fatal,
12
- :level,
13
- :unknown, :to => :logger, :allow_nil => true
14
-
15
- # Emit a warning log message.
16
- #
17
- # @example Log a warning.
18
- # logger.warn("Danger")
19
- #
20
- # @param [ String ] message The warning message.
21
- def warn(message)
22
- logger.warn(message) if logger && logger.respond_to?(:warn)
23
- end
24
-
25
- # Get the mongoid logger.
26
- #
27
- # @example Get the global logger.
28
- # logger.logger
29
- #
30
- # @return [ Logger ] The logger.
31
- def logger
32
- Mongoid.logger
33
- end
34
-
35
- # Inspect the logger.
36
- #
37
- # @example Inspect the logger.
38
- # logger.inspect
39
- #
40
- # @return [ String ] The logger, inspected.
41
- def inspect
42
- "#<Mongoid::Logger:0x#{object_id.to_s(16)} @logger=#{logger.inspect}>"
43
- end
44
- end
45
- end
@@ -1,36 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
-
4
- # Adds multiple database support to documents.
5
- module MultiDatabase
6
- extend ActiveSupport::Concern
7
-
8
- module ClassMethods #:nodoc:
9
-
10
- # Gets the database from the class.
11
- #
12
- # @example Get the database.
13
- # Model.database
14
- #
15
- # @return [ Mongo::DB ] The database.
16
- def database; @database end
17
-
18
- # Set the database name.
19
- #
20
- # @example Set the database name.
21
- # Model.set_database(:testing)
22
- #
23
- # @param [ Symbol ] name The database name.
24
- #
25
- # @return [ String ] The database name.
26
- def set_database(name)
27
- @database = name.to_s
28
- end
29
-
30
- def inherited(subclass)
31
- super
32
- subclass.set_database(database.dup) if database
33
- end
34
- end
35
- end
36
- end
@@ -1,166 +0,0 @@
1
- # encoding: utf-8
2
- module Mongoid #:nodoc:
3
-
4
- # This module contains the named scoping behaviour.
5
- module NamedScope
6
- extend ActiveSupport::Concern
7
-
8
- included do
9
- class_attribute :scopes
10
- self.scopes = {}
11
- end
12
-
13
- module ClassMethods #:nodoc:
14
-
15
- # Gets either the last scope on the stack or creates a new criteria.
16
- #
17
- # @example Get the last or new.
18
- # Person.scoping(true)
19
- #
20
- # @param [ true, false ] embedded Is this scope for an embedded doc?
21
- # @param [ true, false ] scoped Are we applying default scoping?
22
- #
23
- # @return [ Criteria ] The last scope or a new one.
24
- #
25
- # @since 2.0.0
26
- def criteria(embedded = false, scoped = true)
27
- (scope_stack.last || Criteria.new(self, embedded)).tap do |crit|
28
- return crit.apply_default_scope if scoped
29
- end
30
- end
31
-
32
- # Creates a named_scope for the +Document+, similar to ActiveRecord's
33
- # named_scopes. +NamedScopes+ are proxied +Criteria+ objects that can be
34
- # chained.
35
- #
36
- # @example Create named scopes.
37
- #
38
- # class Person
39
- # include Mongoid::Document
40
- # field :active, :type => Boolean
41
- # field :count, :type => Integer
42
- #
43
- # scope :active, :where => { :active => true }
44
- # scope :count_gt_one, :where => { :count.gt => 1 }
45
- # scope :at_least_count, lambda { |count| { :where => { :count.gt => count } } }
46
- # end
47
- #
48
- # @param [ Symbol ] name The name of the scope.
49
- # @param [ Hash, Criteria ] conditions The conditions of the scope.
50
- #
51
- # @since 1.0.0
52
- def scope(name, conditions = {}, &block)
53
- name = name.to_sym
54
- valid_scope_name?(name)
55
- scopes[name] = Scope.new(conditions, &block)
56
- (class << self; self; end).class_eval <<-EOT
57
- def #{name}(*args)
58
- scope = scopes[:#{name}]
59
- conditions = scope.conditions.as_conditions(*args)
60
- scope.extend(criteria.fuse(conditions))
61
- end
62
- EOT
63
- end
64
- alias :named_scope :scope
65
-
66
- # Get a criteria object for the class, scoped to the default if defined.
67
- #
68
- # @example Get a scoped criteria.
69
- # Person.scoped
70
- #
71
- # @param [ true, false ] embedded Is the criteria for embedded docs?
72
- #
73
- # @return [ Criteria ] The scoped criteria.
74
- #
75
- # @since 2.0.0
76
- def scoped(embedded = false)
77
- criteria(embedded).scoped
78
- end
79
-
80
- # Initializes and returns the current scope stack.
81
- #
82
- # @example Get the scope stack.
83
- # Person.scope_stack
84
- #
85
- # @return [ Array<Criteria> ] The scope stack.
86
- #
87
- # @since 1.0.0
88
- def scope_stack
89
- Threaded.scope_stack[object_id] ||= []
90
- end
91
-
92
- # Get a criteria object for the class, ignoring default scoping.
93
- #
94
- # @example Get an unscoped criteria.
95
- # Person.scoped
96
- #
97
- # @param [ true, false ] embedded Is the criteria for embedded docs?
98
- #
99
- # @return [ Criteria ] The unscoped criteria.
100
- #
101
- # @since 2.0.0
102
- def unscoped(embedded = false)
103
- criteria(embedded).unscoped
104
- end
105
-
106
- # Pushes the provided criteria onto the scope stack, and removes it after the
107
- # provided block is yielded.
108
- #
109
- # @example Yield to the criteria.
110
- # Person.with_scope(criteria)
111
- #
112
- # @param [ Criteria ] criteria The criteria to apply.
113
- #
114
- # @return [ Criteria ] The yielded criteria.
115
- #
116
- # @since 1.0.0
117
- def with_scope(criteria)
118
- scope_stack = self.scope_stack
119
- scope_stack << criteria
120
- begin
121
- yield criteria
122
- ensure
123
- scope_stack.pop
124
- end
125
- end
126
-
127
- # When inheriting, we want to copy the scopes from the parent class and
128
- # set the on the child to start, mimicking the behaviour of the old
129
- # class_inheritable_accessor that was deprecated in Rails edge.
130
- #
131
- # @example Inherit from this class.
132
- # Person.inherited(Doctor)
133
- #
134
- # @param [ Class ] subclass The inheriting class.
135
- #
136
- # @since 2.0.0.rc.6
137
- def inherited(subclass)
138
- super
139
- subclass.scopes = scopes.dup
140
- end
141
-
142
- protected
143
-
144
- # Warns or raises exception if overriding another scope or method.
145
- #
146
- # @example Warn or raise error if name exists.
147
- # Model.valid_scope_name?("test")
148
- #
149
- # @param [ String, Symbol ] name The name of the scope.
150
- def valid_scope_name?(name)
151
- if scopes[name] || respond_to?(name, true)
152
- if Mongoid.scope_overwrite_exception
153
- raise Errors::ScopeOverwrite.new(self.name,name)
154
- else
155
- if Mongoid.logger
156
- Mongoid.logger.warn(
157
- "Creating scope :#{name}. " +
158
- "Overwriting existing method #{self.name}.#{name}."
159
- )
160
- end
161
- end
162
- end
163
- end
164
- end
165
- end
166
- end