mongoid 2.4.10 → 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 +843 -9
  2. data/LICENSE +1 -1
  3. data/README.md +10 -11
  4. data/Rakefile +2 -17
  5. data/lib/config/locales/en.yml +441 -51
  6. data/lib/mongoid/atomic/modifiers.rb +2 -2
  7. data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
  8. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
  9. data/lib/mongoid/atomic/paths/embedded.rb +4 -5
  10. data/lib/mongoid/atomic/paths/root.rb +4 -5
  11. data/lib/mongoid/atomic.rb +16 -9
  12. data/lib/mongoid/attributes/processing.rb +14 -10
  13. data/lib/mongoid/attributes/readonly.rb +56 -0
  14. data/lib/mongoid/attributes.rb +95 -32
  15. data/lib/mongoid/callbacks.rb +100 -42
  16. data/lib/mongoid/collections/retry.rb +2 -3
  17. data/lib/mongoid/components.rb +10 -22
  18. data/lib/mongoid/config/environment.rb +4 -3
  19. data/lib/mongoid/config/inflections.rb +6 -0
  20. data/lib/mongoid/config/options.rb +1 -1
  21. data/lib/mongoid/config/validators/option.rb +25 -0
  22. data/lib/mongoid/config/validators/session.rb +140 -0
  23. data/lib/mongoid/config/validators.rb +3 -0
  24. data/lib/mongoid/config.rb +87 -233
  25. data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
  26. data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
  27. data/lib/mongoid/contextual/atomic.rb +179 -0
  28. data/lib/mongoid/contextual/command.rb +43 -0
  29. data/lib/mongoid/contextual/find_and_modify.rb +66 -0
  30. data/lib/mongoid/contextual/map_reduce.rb +273 -0
  31. data/lib/mongoid/contextual/memory.rb +383 -0
  32. data/lib/mongoid/contextual/mongo.rb +543 -0
  33. data/lib/mongoid/contextual.rb +50 -0
  34. data/lib/mongoid/copyable.rb +2 -2
  35. data/lib/mongoid/criteria.rb +436 -248
  36. data/lib/mongoid/criterion/inspection.rb +14 -8
  37. data/lib/mongoid/criterion/scoping.rb +114 -44
  38. data/lib/mongoid/dirty.rb +152 -67
  39. data/lib/mongoid/document.rb +68 -49
  40. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  41. data/lib/mongoid/errors/callback.rb +5 -6
  42. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  43. data/lib/mongoid/errors/document_not_found.rb +98 -17
  44. data/lib/mongoid/errors/eager_load.rb +3 -6
  45. data/lib/mongoid/errors/invalid_collection.rb +3 -3
  46. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  47. data/lib/mongoid/errors/invalid_database.rb +3 -3
  48. data/lib/mongoid/errors/invalid_field.rb +54 -8
  49. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  50. data/lib/mongoid/errors/invalid_find.rb +3 -3
  51. data/lib/mongoid/errors/invalid_index.rb +28 -0
  52. data/lib/mongoid/errors/invalid_options.rb +4 -4
  53. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  54. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  55. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  56. data/lib/mongoid/errors/invalid_time.rb +3 -6
  57. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  58. data/lib/mongoid/errors/mixed_relations.rb +4 -9
  59. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  60. data/lib/mongoid/errors/mongoid_error.rb +54 -3
  61. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  62. data/lib/mongoid/errors/no_default_session.rb +23 -0
  63. data/lib/mongoid/errors/no_environment.rb +3 -3
  64. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  65. data/lib/mongoid/errors/no_parent.rb +24 -0
  66. data/lib/mongoid/errors/no_session_config.rb +22 -0
  67. data/lib/mongoid/errors/no_session_database.rb +27 -0
  68. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  69. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  70. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  71. data/lib/mongoid/errors/scope_overwrite.rb +4 -4
  72. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
  73. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  74. data/lib/mongoid/errors/unsaved_document.rb +4 -8
  75. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  76. data/lib/mongoid/errors/unsupported_version.rb +4 -4
  77. data/lib/mongoid/errors/validations.rb +7 -6
  78. data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
  79. data/lib/mongoid/errors.rb +22 -1
  80. data/lib/mongoid/extensions/array.rb +127 -0
  81. data/lib/mongoid/extensions/big_decimal.rb +42 -0
  82. data/lib/mongoid/extensions/boolean.rb +24 -0
  83. data/lib/mongoid/extensions/date.rb +70 -0
  84. data/lib/mongoid/extensions/date_time.rb +68 -0
  85. data/lib/mongoid/extensions/false_class.rb +26 -0
  86. data/lib/mongoid/extensions/float.rb +44 -0
  87. data/lib/mongoid/extensions/hash.rb +91 -0
  88. data/lib/mongoid/extensions/integer.rb +54 -0
  89. data/lib/mongoid/extensions/module.rb +28 -0
  90. data/lib/mongoid/extensions/nil_class.rb +21 -0
  91. data/lib/mongoid/extensions/object.rb +188 -0
  92. data/lib/mongoid/extensions/object_id.rb +53 -0
  93. data/lib/mongoid/extensions/range.rb +55 -0
  94. data/lib/mongoid/extensions/regexp.rb +27 -0
  95. data/lib/mongoid/extensions/set.rb +55 -0
  96. data/lib/mongoid/extensions/string.rb +155 -0
  97. data/lib/mongoid/extensions/symbol.rb +54 -0
  98. data/lib/mongoid/extensions/time.rb +78 -0
  99. data/lib/mongoid/extensions/time_with_zone.rb +55 -0
  100. data/lib/mongoid/extensions/true_class.rb +26 -0
  101. data/lib/mongoid/extensions.rb +28 -76
  102. data/lib/mongoid/factory.rb +1 -1
  103. data/lib/mongoid/fields/foreign_key.rb +134 -0
  104. data/lib/mongoid/fields/localized.rb +73 -0
  105. data/lib/mongoid/fields/standard.rb +268 -0
  106. data/lib/mongoid/fields/validators/macro.rb +83 -0
  107. data/lib/mongoid/fields/validators.rb +2 -0
  108. data/lib/mongoid/fields.rb +129 -194
  109. data/lib/mongoid/finders.rb +42 -43
  110. data/lib/mongoid/hierarchy.rb +25 -14
  111. data/lib/mongoid/identity_map.rb +31 -19
  112. data/lib/mongoid/indexes/validators/options.rb +80 -0
  113. data/lib/mongoid/indexes.rb +66 -15
  114. data/lib/mongoid/inspection.rb +1 -1
  115. data/lib/mongoid/javascript.rb +1 -1
  116. data/lib/mongoid/json.rb +2 -2
  117. data/lib/mongoid/loggable.rb +69 -0
  118. data/lib/mongoid/matchers/all.rb +7 -8
  119. data/lib/mongoid/matchers/and.rb +3 -3
  120. data/lib/mongoid/matchers/default.rb +6 -4
  121. data/lib/mongoid/matchers/exists.rb +2 -2
  122. data/lib/mongoid/matchers/gt.rb +2 -2
  123. data/lib/mongoid/matchers/gte.rb +2 -2
  124. data/lib/mongoid/matchers/in.rb +3 -7
  125. data/lib/mongoid/matchers/lt.rb +2 -2
  126. data/lib/mongoid/matchers/lte.rb +2 -2
  127. data/lib/mongoid/matchers/ne.rb +2 -2
  128. data/lib/mongoid/matchers/nin.rb +2 -2
  129. data/lib/mongoid/matchers/or.rb +2 -2
  130. data/lib/mongoid/matchers/size.rb +2 -2
  131. data/lib/mongoid/matchers/strategies.rb +3 -3
  132. data/lib/mongoid/matchers.rb +1 -1
  133. data/lib/mongoid/multi_parameter_attributes.rb +8 -10
  134. data/lib/mongoid/nested_attributes.rb +17 -9
  135. data/lib/mongoid/observer.rb +1 -2
  136. data/lib/mongoid/paranoia.rb +13 -18
  137. data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
  138. data/lib/mongoid/persistence/atomic/bit.rb +5 -7
  139. data/lib/mongoid/persistence/atomic/inc.rb +5 -7
  140. data/lib/mongoid/persistence/atomic/operation.rb +45 -6
  141. data/lib/mongoid/persistence/atomic/pop.rb +5 -7
  142. data/lib/mongoid/persistence/atomic/pull.rb +5 -7
  143. data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
  144. data/lib/mongoid/persistence/atomic/push.rb +4 -10
  145. data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
  146. data/lib/mongoid/persistence/atomic/rename.rb +6 -7
  147. data/lib/mongoid/persistence/atomic/sets.rb +5 -7
  148. data/lib/mongoid/persistence/atomic/unset.rb +4 -5
  149. data/lib/mongoid/persistence/atomic.rb +2 -2
  150. data/lib/mongoid/persistence/deletion.rb +2 -2
  151. data/lib/mongoid/persistence/insertion.rb +10 -16
  152. data/lib/mongoid/persistence/modification.rb +5 -9
  153. data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
  154. data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
  155. data/lib/mongoid/persistence/operations/insert.rb +4 -4
  156. data/lib/mongoid/persistence/operations/remove.rb +4 -4
  157. data/lib/mongoid/persistence/operations/update.rb +5 -5
  158. data/lib/mongoid/persistence/operations.rb +6 -19
  159. data/lib/mongoid/persistence.rb +64 -27
  160. data/lib/mongoid/railtie.rb +26 -11
  161. data/lib/mongoid/railties/database.rake +22 -108
  162. data/lib/mongoid/relations/accessors.rb +119 -19
  163. data/lib/mongoid/relations/auto_save.rb +59 -5
  164. data/lib/mongoid/relations/binding.rb +211 -2
  165. data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
  166. data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
  167. data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
  168. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
  169. data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
  170. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
  171. data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
  172. data/lib/mongoid/relations/builder.rb +3 -3
  173. data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
  174. data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
  175. data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
  176. data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
  177. data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
  178. data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
  179. data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
  180. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
  181. data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
  182. data/lib/mongoid/relations/builders.rb +19 -16
  183. data/lib/mongoid/relations/cascading/delete.rb +3 -5
  184. data/lib/mongoid/relations/cascading/destroy.rb +3 -3
  185. data/lib/mongoid/relations/cascading/nullify.rb +3 -3
  186. data/lib/mongoid/relations/cascading/restrict.rb +37 -0
  187. data/lib/mongoid/relations/cascading.rb +6 -4
  188. data/lib/mongoid/relations/constraint.rb +4 -3
  189. data/lib/mongoid/relations/conversions.rb +5 -6
  190. data/lib/mongoid/relations/cyclic.rb +7 -7
  191. data/lib/mongoid/relations/embedded/batchable.rb +346 -0
  192. data/lib/mongoid/relations/embedded/in.rb +23 -12
  193. data/lib/mongoid/relations/embedded/many.rb +99 -160
  194. data/lib/mongoid/relations/embedded/one.rb +25 -14
  195. data/lib/mongoid/relations/macros.rb +105 -60
  196. data/lib/mongoid/relations/many.rb +93 -14
  197. data/lib/mongoid/relations/metadata.rb +231 -45
  198. data/lib/mongoid/relations/nested_builder.rb +3 -5
  199. data/lib/mongoid/relations/one.rb +2 -2
  200. data/lib/mongoid/relations/options.rb +2 -2
  201. data/lib/mongoid/relations/polymorphic.rb +9 -9
  202. data/lib/mongoid/relations/proxy.rb +60 -31
  203. data/lib/mongoid/relations/referenced/in.rb +40 -15
  204. data/lib/mongoid/relations/referenced/many.rb +116 -128
  205. data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
  206. data/lib/mongoid/relations/referenced/one.rb +34 -13
  207. data/lib/mongoid/relations/reflections.rb +3 -3
  208. data/lib/mongoid/relations/synchronization.rb +19 -23
  209. data/lib/mongoid/relations/targets/enumerable.rb +86 -57
  210. data/lib/mongoid/relations/touchable.rb +32 -0
  211. data/lib/mongoid/relations.rb +6 -6
  212. data/lib/mongoid/reloading.rb +12 -14
  213. data/lib/mongoid/scoping.rb +329 -0
  214. data/lib/mongoid/serialization.rb +13 -30
  215. data/lib/mongoid/sessions/factory.rb +106 -0
  216. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  217. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  218. data/lib/mongoid/sessions/validators.rb +2 -0
  219. data/lib/mongoid/sessions.rb +359 -0
  220. data/lib/mongoid/sharding.rb +6 -6
  221. data/lib/mongoid/state.rb +6 -7
  222. data/lib/mongoid/threaded/lifecycle.rb +21 -21
  223. data/lib/mongoid/threaded/sessions.rb +0 -0
  224. data/lib/mongoid/threaded.rb +167 -59
  225. data/lib/mongoid/timestamps/created.rb +8 -4
  226. data/lib/mongoid/timestamps/timeless.rb +6 -4
  227. data/lib/mongoid/timestamps/updated.rb +3 -3
  228. data/lib/mongoid/timestamps.rb +1 -1
  229. data/lib/mongoid/unit_of_work.rb +61 -0
  230. data/lib/mongoid/validations/associated.rb +2 -2
  231. data/lib/mongoid/validations/format.rb +2 -2
  232. data/lib/mongoid/validations/presence.rb +34 -4
  233. data/lib/mongoid/validations/uniqueness.rb +8 -10
  234. data/lib/mongoid/validations.rb +28 -20
  235. data/lib/mongoid/version.rb +2 -2
  236. data/lib/mongoid/versioning.rb +25 -26
  237. data/lib/mongoid.rb +24 -39
  238. data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
  239. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
  240. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
  241. data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
  242. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
  243. data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
  244. data/lib/rails/generators/mongoid_generator.rb +5 -5
  245. data/lib/rails/mongoid.rb +69 -25
  246. metadata +92 -154
  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/master.rb +0 -45
  269. data/lib/mongoid/collections/operations.rb +0 -44
  270. data/lib/mongoid/collections.rb +0 -120
  271. data/lib/mongoid/config/database.rb +0 -181
  272. data/lib/mongoid/config/replset_database.rb +0 -80
  273. data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
  274. data/lib/mongoid/contexts/enumerable.rb +0 -313
  275. data/lib/mongoid/contexts/mongo.rb +0 -487
  276. data/lib/mongoid/contexts.rb +0 -25
  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 -108
  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 -76
  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/operation.rb +0 -63
  343. data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
  344. data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
  345. data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
  346. data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
  347. data/lib/mongoid/relations/embedded/atomic.rb +0 -89
  348. data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
  349. data/lib/mongoid/relations/referenced/batch.rb +0 -73
  350. data/lib/mongoid/safety.rb +0 -105
  351. data/lib/mongoid/scope.rb +0 -31
@@ -0,0 +1,268 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Fields
4
+ class Standard
5
+
6
+ # Defines the behaviour for defined fields in the document.
7
+ # Set readers for the instance variables.
8
+ attr_accessor :default_val, :label, :name, :options
9
+
10
+ delegate :demongoize, :evolve, :mongoize, to: :type
11
+
12
+ # Adds the atomic changes for this type of resizable field.
13
+ #
14
+ # @example Add the atomic changes.
15
+ # field.add_atomic_changes(doc, "key", {}, [], [])
16
+ #
17
+ # @param [ Document ] document The document to add to.
18
+ # @param [ String ] name The name of the field.
19
+ # @param [ String ] key The atomic location of the field.
20
+ # @param [ Hash ] mods The current modifications.
21
+ # @param [ Array ] new The new elements to add.
22
+ # @param [ Array ] old The old elements getting removed.
23
+ #
24
+ # @since 2.4.0
25
+ def add_atomic_changes(document, name, key, mods, new, old)
26
+ mods[key] = new
27
+ end
28
+
29
+ # Get the constraint from the metadata once.
30
+ #
31
+ # @example Get the constraint.
32
+ # field.constraint
33
+ #
34
+ # @return [ Constraint ] The relation's contraint.
35
+ #
36
+ # @since 2.1.0
37
+ def constraint
38
+ @constraint ||= metadata.constraint
39
+ end
40
+
41
+ # Evaluate the default value and return it. Will handle the
42
+ # serialization, proc calls, and duplication if necessary.
43
+ #
44
+ # @example Evaluate the default value.
45
+ # field.eval_default(document)
46
+ #
47
+ # @param [ Document ] doc The document the field belongs to.
48
+ #
49
+ # @return [ Object ] The serialized default value.
50
+ #
51
+ # @since 2.1.8
52
+ def eval_default(doc)
53
+ if fields = Threaded.selection
54
+ evaluated_default(doc) if included?(fields)
55
+ else
56
+ evaluated_default(doc)
57
+ end
58
+ end
59
+
60
+ # Is this field a foreign key?
61
+ #
62
+ # @example Is the field a foreign key?
63
+ # field.foreign_key?
64
+ #
65
+ # @return [ true, false ] If the field is a foreign key.
66
+ #
67
+ # @since 2.4.0
68
+ def foreign_key?
69
+ false
70
+ end
71
+
72
+ # Create the new field with a name and optional additional options.
73
+ #
74
+ # @example Create the new field.
75
+ # Field.new(:name, :type => String)
76
+ #
77
+ # @param [ Hash ] options The field options.
78
+ #
79
+ # @option options [ Class ] :type The class of the field.
80
+ # @option options [ Object ] :default The default value for the field.
81
+ # @option options [ String ] :label The field's label.
82
+ #
83
+ # @since 3.0.0
84
+ def initialize(name, options = {})
85
+ @name = name
86
+ @options = options
87
+ @label = options[:label]
88
+ @default_val = options[:default]
89
+ end
90
+
91
+ # Is the field localized or not?
92
+ #
93
+ # @example Is the field localized?
94
+ # field.localized?
95
+ #
96
+ # @return [ true, false ] If the field is localized.
97
+ #
98
+ # @since 2.3.0
99
+ def localized?
100
+ false
101
+ end
102
+
103
+ # Get the metadata for the field if its a foreign key.
104
+ #
105
+ # @example Get the metadata.
106
+ # field.metadata
107
+ #
108
+ # @return [ Metadata ] The relation metadata.
109
+ #
110
+ # @since 2.2.0
111
+ def metadata
112
+ @metadata ||= options[:metadata]
113
+ end
114
+
115
+ # Is the field a BSON::ObjectId?
116
+ #
117
+ # @example Is the field a BSON::ObjectId?
118
+ # field.object_id_field?
119
+ #
120
+ # @return [ true, false ] If the field is a BSON::ObjectId.
121
+ #
122
+ # @since 2.2.0
123
+ def object_id_field?
124
+ @object_id_field ||= (type == Moped::BSON::ObjectId)
125
+ end
126
+
127
+ # Does the field pre-process it's default value?
128
+ #
129
+ # @example Does the field pre-process the default?
130
+ # field.pre_processed?
131
+ #
132
+ # @return [ true, false ] If the field's default is pre-processed.
133
+ #
134
+ # @since 3.0.0
135
+ def pre_processed?
136
+ @pre_processed ||=
137
+ (options[:pre_processed] || (default_val && !default_val.is_a?(::Proc)))
138
+ end
139
+
140
+ # Get the type of this field - inferred from the class name.
141
+ #
142
+ # @example Get the type.
143
+ # field.type
144
+ #
145
+ # @return [ Class ] The name of the class.
146
+ #
147
+ # @since 2.1.0
148
+ def type
149
+ @type ||= options[:type] || Object
150
+ end
151
+
152
+ # Is this field included in versioned attributes?
153
+ #
154
+ # @example Is the field versioned?
155
+ # field.versioned?
156
+ #
157
+ # @return [ true, false ] If the field is included in versioning.
158
+ #
159
+ # @since 2.1.0
160
+ def versioned?
161
+ @versioned ||= (options[:versioned].nil? ? true : options[:versioned])
162
+ end
163
+
164
+ private
165
+
166
+ # Get the name of the default method for this field.
167
+ #
168
+ # @api private
169
+ #
170
+ # @example Get the default name.
171
+ # field.default_name
172
+ #
173
+ # @return [ String ] The method name.
174
+ #
175
+ # @since 3.0.0
176
+ def default_name
177
+ @default_name ||= "__#{name}_default__"
178
+ end
179
+
180
+ # Define the method for getting the default on the document.
181
+ #
182
+ # @api private
183
+ #
184
+ # @example Define the method.
185
+ # field.define_default_method(doc)
186
+ #
187
+ # @note Ruby's instance_exec was just too slow.
188
+ #
189
+ # @param [ Document ] doc The document.
190
+ #
191
+ # @since 3.0.0
192
+ def define_default_method(doc)
193
+ unless doc.respond_to?(default_name)
194
+ doc.class.__send__(:define_method, default_name, default_val)
195
+ end
196
+ end
197
+
198
+ # Is the field included in the fields that were returned from the
199
+ # database? We can apply the default if:
200
+ # 1. The field is included in an only limitation (field: 1)
201
+ # 2. The field is not excluded in a without limitation (field: 0)
202
+ #
203
+ # @example Is the field included?
204
+ # field.included?(fields)
205
+ #
206
+ # @param [ Hash ] fields The field limitations.
207
+ #
208
+ # @return [ true, false ] If the field was included.
209
+ #
210
+ # @since 2.4.4
211
+ def included?(fields)
212
+ (fields.values.first == 1 && fields[name.to_s] == 1) ||
213
+ (fields.values.first == 0 && !fields.has_key?(name.to_s))
214
+ end
215
+
216
+ # Get the evaluated default.
217
+ #
218
+ # @example Get the evaluated default.
219
+ # field.evaluated_default.
220
+ #
221
+ # @param [ Document ] doc The doc being applied to.
222
+ #
223
+ # @return [ Object ] The default value.
224
+ #
225
+ # @since 2.4.4
226
+ def evaluated_default(doc)
227
+ if default_val.respond_to?(:call)
228
+ evaluate_default_proc(doc)
229
+ else
230
+ serialize_default(default_val.__deep_copy__)
231
+ end
232
+ end
233
+
234
+ # Evaluate the default proc. In some cases we need to instance exec,
235
+ # in others we don't.
236
+ #
237
+ # @example Eval the default proc.
238
+ # field.evaluate_default_proc(band)
239
+ #
240
+ # @param [ Document ] doc The document.
241
+ #
242
+ # @return [ Object ] The called proc.
243
+ #
244
+ # @since 3.0.0
245
+ def evaluate_default_proc(doc)
246
+ define_default_method(doc)
247
+ serialize_default(doc.__send__(default_name))
248
+ end
249
+
250
+ # This is used when default values need to be serialized. Most of the
251
+ # time just return the object.
252
+ #
253
+ # @api private
254
+ #
255
+ # @example Serialize the default value.
256
+ # field.serialize_default(obj)
257
+ #
258
+ # @param [ Object ] object The default.
259
+ #
260
+ # @return [ Object ] The serialized default.
261
+ #
262
+ # @since 3.0.0
263
+ def serialize_default(object)
264
+ mongoize(object)
265
+ end
266
+ end
267
+ end
268
+ end
@@ -0,0 +1,83 @@
1
+ # encoding: utf-8
2
+ module Mongoid
3
+ module Fields
4
+ module Validators
5
+
6
+ # Validates the params passed to the field macro.
7
+ module Macro
8
+ extend self
9
+
10
+ OPTIONS = [
11
+ :as,
12
+ :default,
13
+ :identity,
14
+ :label,
15
+ :localize,
16
+ :metadata,
17
+ :pre_processed,
18
+ :subtype,
19
+ :type,
20
+ :versioned
21
+ ]
22
+
23
+ # Validate the field definition.
24
+ #
25
+ # @example Validate the field definition.
26
+ # Macro.validate(Model, :name, { localized: true })
27
+ #
28
+ # @param [ Class ] klass The model class.
29
+ # @param [ Symbol ] name The field name.
30
+ # @param [ Hash ] options The provided options.
31
+ #
32
+ # @since 3.0.0
33
+ def validate(klass, name, options)
34
+ validate_name(klass, name)
35
+ validate_options(klass, name, options)
36
+ end
37
+
38
+ private
39
+
40
+ # Determine if the field name is allowed, if not raise an error.
41
+ #
42
+ # @api private
43
+ #
44
+ # @example Check the field name.
45
+ # Macro.validate_name(Model, :name)
46
+ #
47
+ # @param [ Class ] klass The model class.
48
+ # @param [ Symbol ] name The field name.
49
+ #
50
+ # @raise [ Errors::InvalidField ] If the name is not allowed.
51
+ #
52
+ # @since 3.0.0
53
+ def validate_name(klass, name)
54
+ if Mongoid.destructive_fields.include?(name)
55
+ raise Errors::InvalidField.new(klass, name)
56
+ end
57
+ end
58
+
59
+ # Validate that the field options are allowed.
60
+ #
61
+ # @api private
62
+ #
63
+ # @example Validate the field options.
64
+ # Macro.validate_options(Model, :name, { localized: true })
65
+ #
66
+ # @param [ Class ] klass The model class.
67
+ # @param [ Symbol ] name The field name.
68
+ # @param [ Hash ] options The provided options.
69
+ #
70
+ # @raise [ Errors::InvalidFieldOption ] If an option is invalid.
71
+ #
72
+ # @since 3.0.0
73
+ def validate_options(klass, name, options)
74
+ options.keys.each do |option|
75
+ if !OPTIONS.include?(option) && !Fields.options.include?(option)
76
+ raise Errors::InvalidFieldOption.new(klass, name, option, OPTIONS)
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,2 @@
1
+ # encoding: utf-8
2
+ require "mongoid/fields/validators/macro"