mongoid-multi-db 3.0.0

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 (276) hide show
  1. data/CHANGELOG.md +615 -0
  2. data/LICENSE +20 -0
  3. data/README.md +62 -0
  4. data/Rakefile +49 -0
  5. data/lib/config/locales/bg.yml +54 -0
  6. data/lib/config/locales/de.yml +54 -0
  7. data/lib/config/locales/en-GB.yml +55 -0
  8. data/lib/config/locales/en.yml +55 -0
  9. data/lib/config/locales/es.yml +52 -0
  10. data/lib/config/locales/fr.yml +55 -0
  11. data/lib/config/locales/hi.yml +46 -0
  12. data/lib/config/locales/hu.yml +57 -0
  13. data/lib/config/locales/id.yml +55 -0
  14. data/lib/config/locales/it.yml +52 -0
  15. data/lib/config/locales/ja.yml +50 -0
  16. data/lib/config/locales/kr.yml +47 -0
  17. data/lib/config/locales/nl.yml +52 -0
  18. data/lib/config/locales/pl.yml +52 -0
  19. data/lib/config/locales/pt-BR.yml +53 -0
  20. data/lib/config/locales/pt.yml +53 -0
  21. data/lib/config/locales/ro.yml +59 -0
  22. data/lib/config/locales/ru.yml +54 -0
  23. data/lib/config/locales/sv.yml +53 -0
  24. data/lib/config/locales/vi.yml +55 -0
  25. data/lib/config/locales/zh-CN.yml +46 -0
  26. data/lib/mongoid.rb +148 -0
  27. data/lib/mongoid/atomic.rb +230 -0
  28. data/lib/mongoid/atomic/modifiers.rb +243 -0
  29. data/lib/mongoid/atomic/paths.rb +3 -0
  30. data/lib/mongoid/atomic/paths/embedded.rb +43 -0
  31. data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
  32. data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
  33. data/lib/mongoid/atomic/paths/root.rb +40 -0
  34. data/lib/mongoid/attributes.rb +234 -0
  35. data/lib/mongoid/attributes/processing.rb +146 -0
  36. data/lib/mongoid/callbacks.rb +135 -0
  37. data/lib/mongoid/collection.rb +153 -0
  38. data/lib/mongoid/collection_proxy.rb +59 -0
  39. data/lib/mongoid/collections.rb +120 -0
  40. data/lib/mongoid/collections/master.rb +45 -0
  41. data/lib/mongoid/collections/operations.rb +44 -0
  42. data/lib/mongoid/collections/retry.rb +46 -0
  43. data/lib/mongoid/components.rb +96 -0
  44. data/lib/mongoid/config.rb +347 -0
  45. data/lib/mongoid/config/database.rb +186 -0
  46. data/lib/mongoid/config/replset_database.rb +82 -0
  47. data/lib/mongoid/connection_proxy.rb +30 -0
  48. data/lib/mongoid/contexts.rb +25 -0
  49. data/lib/mongoid/contexts/enumerable.rb +288 -0
  50. data/lib/mongoid/contexts/enumerable/sort.rb +43 -0
  51. data/lib/mongoid/contexts/mongo.rb +409 -0
  52. data/lib/mongoid/copyable.rb +48 -0
  53. data/lib/mongoid/criteria.rb +418 -0
  54. data/lib/mongoid/criterion/builder.rb +34 -0
  55. data/lib/mongoid/criterion/complex.rb +84 -0
  56. data/lib/mongoid/criterion/creational.rb +34 -0
  57. data/lib/mongoid/criterion/exclusion.rb +108 -0
  58. data/lib/mongoid/criterion/inclusion.rb +305 -0
  59. data/lib/mongoid/criterion/inspection.rb +22 -0
  60. data/lib/mongoid/criterion/optional.rb +232 -0
  61. data/lib/mongoid/criterion/selector.rb +153 -0
  62. data/lib/mongoid/cursor.rb +86 -0
  63. data/lib/mongoid/database_proxy.rb +97 -0
  64. data/lib/mongoid/default_scope.rb +36 -0
  65. data/lib/mongoid/dirty.rb +110 -0
  66. data/lib/mongoid/document.rb +280 -0
  67. data/lib/mongoid/errors.rb +17 -0
  68. data/lib/mongoid/errors/callback.rb +26 -0
  69. data/lib/mongoid/errors/document_not_found.rb +28 -0
  70. data/lib/mongoid/errors/eager_load.rb +25 -0
  71. data/lib/mongoid/errors/invalid_collection.rb +18 -0
  72. data/lib/mongoid/errors/invalid_database.rb +19 -0
  73. data/lib/mongoid/errors/invalid_field.rb +18 -0
  74. data/lib/mongoid/errors/invalid_find.rb +19 -0
  75. data/lib/mongoid/errors/invalid_options.rb +28 -0
  76. data/lib/mongoid/errors/invalid_time.rb +25 -0
  77. data/lib/mongoid/errors/invalid_type.rb +25 -0
  78. data/lib/mongoid/errors/mixed_relations.rb +37 -0
  79. data/lib/mongoid/errors/mongoid_error.rb +26 -0
  80. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
  81. data/lib/mongoid/errors/unsaved_document.rb +23 -0
  82. data/lib/mongoid/errors/unsupported_version.rb +20 -0
  83. data/lib/mongoid/errors/validations.rb +23 -0
  84. data/lib/mongoid/extensions.rb +82 -0
  85. data/lib/mongoid/extensions/array/deletion.rb +29 -0
  86. data/lib/mongoid/extensions/false_class/equality.rb +26 -0
  87. data/lib/mongoid/extensions/hash/criteria_helpers.rb +45 -0
  88. data/lib/mongoid/extensions/hash/scoping.rb +25 -0
  89. data/lib/mongoid/extensions/integer/checks.rb +23 -0
  90. data/lib/mongoid/extensions/nil/collectionization.rb +23 -0
  91. data/lib/mongoid/extensions/object/checks.rb +29 -0
  92. data/lib/mongoid/extensions/object/reflections.rb +48 -0
  93. data/lib/mongoid/extensions/object/substitutable.rb +15 -0
  94. data/lib/mongoid/extensions/object/yoda.rb +44 -0
  95. data/lib/mongoid/extensions/object_id/conversions.rb +60 -0
  96. data/lib/mongoid/extensions/proc/scoping.rb +25 -0
  97. data/lib/mongoid/extensions/string/checks.rb +36 -0
  98. data/lib/mongoid/extensions/string/conversions.rb +22 -0
  99. data/lib/mongoid/extensions/string/inflections.rb +118 -0
  100. data/lib/mongoid/extensions/symbol/checks.rb +23 -0
  101. data/lib/mongoid/extensions/symbol/inflections.rb +66 -0
  102. data/lib/mongoid/extensions/true_class/equality.rb +26 -0
  103. data/lib/mongoid/extras.rb +31 -0
  104. data/lib/mongoid/factory.rb +46 -0
  105. data/lib/mongoid/fields.rb +332 -0
  106. data/lib/mongoid/fields/mappings.rb +41 -0
  107. data/lib/mongoid/fields/serializable.rb +201 -0
  108. data/lib/mongoid/fields/serializable/array.rb +49 -0
  109. data/lib/mongoid/fields/serializable/big_decimal.rb +42 -0
  110. data/lib/mongoid/fields/serializable/bignum.rb +10 -0
  111. data/lib/mongoid/fields/serializable/binary.rb +11 -0
  112. data/lib/mongoid/fields/serializable/boolean.rb +43 -0
  113. data/lib/mongoid/fields/serializable/date.rb +51 -0
  114. data/lib/mongoid/fields/serializable/date_time.rb +28 -0
  115. data/lib/mongoid/fields/serializable/fixnum.rb +10 -0
  116. data/lib/mongoid/fields/serializable/float.rb +32 -0
  117. data/lib/mongoid/fields/serializable/foreign_keys/array.rb +42 -0
  118. data/lib/mongoid/fields/serializable/foreign_keys/object.rb +47 -0
  119. data/lib/mongoid/fields/serializable/hash.rb +11 -0
  120. data/lib/mongoid/fields/serializable/integer.rb +44 -0
  121. data/lib/mongoid/fields/serializable/localized.rb +41 -0
  122. data/lib/mongoid/fields/serializable/nil_class.rb +38 -0
  123. data/lib/mongoid/fields/serializable/object.rb +11 -0
  124. data/lib/mongoid/fields/serializable/object_id.rb +31 -0
  125. data/lib/mongoid/fields/serializable/range.rb +42 -0
  126. data/lib/mongoid/fields/serializable/set.rb +42 -0
  127. data/lib/mongoid/fields/serializable/string.rb +27 -0
  128. data/lib/mongoid/fields/serializable/symbol.rb +27 -0
  129. data/lib/mongoid/fields/serializable/time.rb +23 -0
  130. data/lib/mongoid/fields/serializable/time_with_zone.rb +23 -0
  131. data/lib/mongoid/fields/serializable/timekeeping.rb +106 -0
  132. data/lib/mongoid/finders.rb +152 -0
  133. data/lib/mongoid/hierarchy.rb +120 -0
  134. data/lib/mongoid/identity.rb +92 -0
  135. data/lib/mongoid/identity_map.rb +119 -0
  136. data/lib/mongoid/indexes.rb +54 -0
  137. data/lib/mongoid/inspection.rb +54 -0
  138. data/lib/mongoid/javascript.rb +20 -0
  139. data/lib/mongoid/javascript/functions.yml +63 -0
  140. data/lib/mongoid/json.rb +16 -0
  141. data/lib/mongoid/keys.rb +144 -0
  142. data/lib/mongoid/logger.rb +39 -0
  143. data/lib/mongoid/matchers.rb +32 -0
  144. data/lib/mongoid/matchers/all.rb +21 -0
  145. data/lib/mongoid/matchers/and.rb +30 -0
  146. data/lib/mongoid/matchers/default.rb +70 -0
  147. data/lib/mongoid/matchers/exists.rb +23 -0
  148. data/lib/mongoid/matchers/gt.rb +21 -0
  149. data/lib/mongoid/matchers/gte.rb +21 -0
  150. data/lib/mongoid/matchers/in.rb +21 -0
  151. data/lib/mongoid/matchers/lt.rb +21 -0
  152. data/lib/mongoid/matchers/lte.rb +21 -0
  153. data/lib/mongoid/matchers/ne.rb +21 -0
  154. data/lib/mongoid/matchers/nin.rb +21 -0
  155. data/lib/mongoid/matchers/or.rb +33 -0
  156. data/lib/mongoid/matchers/size.rb +21 -0
  157. data/lib/mongoid/matchers/strategies.rb +93 -0
  158. data/lib/mongoid/multi_database.rb +31 -0
  159. data/lib/mongoid/multi_parameter_attributes.rb +106 -0
  160. data/lib/mongoid/named_scope.rb +146 -0
  161. data/lib/mongoid/nested_attributes.rb +54 -0
  162. data/lib/mongoid/observer.rb +170 -0
  163. data/lib/mongoid/paranoia.rb +158 -0
  164. data/lib/mongoid/persistence.rb +264 -0
  165. data/lib/mongoid/persistence/atomic.rb +223 -0
  166. data/lib/mongoid/persistence/atomic/add_to_set.rb +35 -0
  167. data/lib/mongoid/persistence/atomic/bit.rb +37 -0
  168. data/lib/mongoid/persistence/atomic/inc.rb +31 -0
  169. data/lib/mongoid/persistence/atomic/operation.rb +85 -0
  170. data/lib/mongoid/persistence/atomic/pop.rb +34 -0
  171. data/lib/mongoid/persistence/atomic/pull.rb +34 -0
  172. data/lib/mongoid/persistence/atomic/pull_all.rb +34 -0
  173. data/lib/mongoid/persistence/atomic/push.rb +31 -0
  174. data/lib/mongoid/persistence/atomic/push_all.rb +31 -0
  175. data/lib/mongoid/persistence/atomic/rename.rb +31 -0
  176. data/lib/mongoid/persistence/atomic/sets.rb +30 -0
  177. data/lib/mongoid/persistence/atomic/unset.rb +28 -0
  178. data/lib/mongoid/persistence/deletion.rb +32 -0
  179. data/lib/mongoid/persistence/insertion.rb +41 -0
  180. data/lib/mongoid/persistence/modification.rb +37 -0
  181. data/lib/mongoid/persistence/operations.rb +211 -0
  182. data/lib/mongoid/persistence/operations/embedded/insert.rb +42 -0
  183. data/lib/mongoid/persistence/operations/embedded/remove.rb +40 -0
  184. data/lib/mongoid/persistence/operations/insert.rb +34 -0
  185. data/lib/mongoid/persistence/operations/remove.rb +33 -0
  186. data/lib/mongoid/persistence/operations/update.rb +64 -0
  187. data/lib/mongoid/railtie.rb +126 -0
  188. data/lib/mongoid/railties/database.rake +182 -0
  189. data/lib/mongoid/railties/document.rb +12 -0
  190. data/lib/mongoid/relations.rb +144 -0
  191. data/lib/mongoid/relations/accessors.rb +138 -0
  192. data/lib/mongoid/relations/auto_save.rb +38 -0
  193. data/lib/mongoid/relations/binding.rb +26 -0
  194. data/lib/mongoid/relations/bindings.rb +9 -0
  195. data/lib/mongoid/relations/bindings/embedded/in.rb +69 -0
  196. data/lib/mongoid/relations/bindings/embedded/many.rb +93 -0
  197. data/lib/mongoid/relations/bindings/embedded/one.rb +61 -0
  198. data/lib/mongoid/relations/bindings/referenced/in.rb +76 -0
  199. data/lib/mongoid/relations/bindings/referenced/many.rb +54 -0
  200. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +51 -0
  201. data/lib/mongoid/relations/bindings/referenced/one.rb +58 -0
  202. data/lib/mongoid/relations/builder.rb +57 -0
  203. data/lib/mongoid/relations/builders.rb +83 -0
  204. data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
  205. data/lib/mongoid/relations/builders/embedded/many.rb +40 -0
  206. data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
  207. data/lib/mongoid/relations/builders/nested_attributes/many.rb +110 -0
  208. data/lib/mongoid/relations/builders/nested_attributes/one.rb +135 -0
  209. data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
  210. data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
  211. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +38 -0
  212. data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
  213. data/lib/mongoid/relations/cascading.rb +56 -0
  214. data/lib/mongoid/relations/cascading/delete.rb +19 -0
  215. data/lib/mongoid/relations/cascading/destroy.rb +26 -0
  216. data/lib/mongoid/relations/cascading/nullify.rb +18 -0
  217. data/lib/mongoid/relations/cascading/strategy.rb +26 -0
  218. data/lib/mongoid/relations/constraint.rb +42 -0
  219. data/lib/mongoid/relations/conversions.rb +35 -0
  220. data/lib/mongoid/relations/cyclic.rb +103 -0
  221. data/lib/mongoid/relations/embedded/atomic.rb +89 -0
  222. data/lib/mongoid/relations/embedded/atomic/operation.rb +63 -0
  223. data/lib/mongoid/relations/embedded/atomic/pull.rb +65 -0
  224. data/lib/mongoid/relations/embedded/atomic/push_all.rb +59 -0
  225. data/lib/mongoid/relations/embedded/atomic/set.rb +61 -0
  226. data/lib/mongoid/relations/embedded/atomic/unset.rb +41 -0
  227. data/lib/mongoid/relations/embedded/in.rb +220 -0
  228. data/lib/mongoid/relations/embedded/many.rb +560 -0
  229. data/lib/mongoid/relations/embedded/one.rb +206 -0
  230. data/lib/mongoid/relations/embedded/sort.rb +31 -0
  231. data/lib/mongoid/relations/macros.rb +310 -0
  232. data/lib/mongoid/relations/many.rb +135 -0
  233. data/lib/mongoid/relations/metadata.rb +919 -0
  234. data/lib/mongoid/relations/nested_builder.rb +75 -0
  235. data/lib/mongoid/relations/one.rb +36 -0
  236. data/lib/mongoid/relations/options.rb +47 -0
  237. data/lib/mongoid/relations/polymorphic.rb +40 -0
  238. data/lib/mongoid/relations/proxy.rb +145 -0
  239. data/lib/mongoid/relations/referenced/batch.rb +72 -0
  240. data/lib/mongoid/relations/referenced/batch/insert.rb +57 -0
  241. data/lib/mongoid/relations/referenced/in.rb +262 -0
  242. data/lib/mongoid/relations/referenced/many.rb +623 -0
  243. data/lib/mongoid/relations/referenced/many_to_many.rb +396 -0
  244. data/lib/mongoid/relations/referenced/one.rb +272 -0
  245. data/lib/mongoid/relations/reflections.rb +62 -0
  246. data/lib/mongoid/relations/synchronization.rb +153 -0
  247. data/lib/mongoid/relations/targets.rb +2 -0
  248. data/lib/mongoid/relations/targets/enumerable.rb +372 -0
  249. data/lib/mongoid/reloading.rb +91 -0
  250. data/lib/mongoid/safety.rb +105 -0
  251. data/lib/mongoid/scope.rb +31 -0
  252. data/lib/mongoid/serialization.rb +134 -0
  253. data/lib/mongoid/sharding.rb +61 -0
  254. data/lib/mongoid/state.rb +97 -0
  255. data/lib/mongoid/threaded.rb +530 -0
  256. data/lib/mongoid/threaded/lifecycle.rb +192 -0
  257. data/lib/mongoid/timestamps.rb +15 -0
  258. data/lib/mongoid/timestamps/created.rb +24 -0
  259. data/lib/mongoid/timestamps/timeless.rb +50 -0
  260. data/lib/mongoid/timestamps/updated.rb +26 -0
  261. data/lib/mongoid/validations.rb +140 -0
  262. data/lib/mongoid/validations/associated.rb +46 -0
  263. data/lib/mongoid/validations/uniqueness.rb +145 -0
  264. data/lib/mongoid/version.rb +4 -0
  265. data/lib/mongoid/versioning.rb +185 -0
  266. data/lib/rack/mongoid.rb +2 -0
  267. data/lib/rack/mongoid/middleware/identity_map.rb +38 -0
  268. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  269. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +20 -0
  270. data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
  271. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
  272. data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
  273. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
  274. data/lib/rails/generators/mongoid_generator.rb +70 -0
  275. data/lib/rails/mongoid.rb +91 -0
  276. metadata +465 -0
@@ -0,0 +1,192 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Threaded #:nodoc:
4
+
5
+ # This module contains convenience methods for document lifecycle that
6
+ # resides on thread locals.
7
+ module Lifecycle
8
+ extend ActiveSupport::Concern
9
+
10
+ private
11
+
12
+ # Begin the assignment of attributes. While in this block embedded
13
+ # documents will not autosave themselves in order to allow the document to
14
+ # be in a valid state.
15
+ #
16
+ # @example Execute the assignment.
17
+ # _assigning do
18
+ # person.attributes = { :addresses => [ address ] }
19
+ # end
20
+ #
21
+ # @return [ Object ] The yielded value.
22
+ #
23
+ # @since 2.2.0
24
+ def _assigning
25
+ Threaded.begin_assign
26
+ yield
27
+ ensure
28
+ Threaded.exit_assign
29
+ end
30
+
31
+ # Is the current thread in assigning mode?
32
+ #
33
+ # @example Is the current thread in assigning mode?
34
+ # proxy._assigning?
35
+ #
36
+ # @return [ true, false ] If the thread is assigning.
37
+ #
38
+ # @since 2.1.0
39
+ def _assigning?
40
+ Threaded.assigning?
41
+ end
42
+
43
+ # Execute a block in binding mode.
44
+ #
45
+ # @example Execute in binding mode.
46
+ # binding do
47
+ # relation.push(doc)
48
+ # end
49
+ #
50
+ # @return [ Object ] The return value of the block.
51
+ #
52
+ # @since 2.1.0
53
+ def _binding
54
+ Threaded.begin_bind
55
+ yield
56
+ ensure
57
+ Threaded.exit_bind
58
+ end
59
+
60
+ # Is the current thread in binding mode?
61
+ #
62
+ # @example Is the current thread in binding mode?
63
+ # proxy.binding?
64
+ #
65
+ # @return [ true, false ] If the thread is binding.
66
+ #
67
+ # @since 2.1.0
68
+ def _binding?
69
+ Threaded.binding?
70
+ end
71
+
72
+ # Execute a block in building mode.
73
+ #
74
+ # @example Execute in building mode.
75
+ # _building do
76
+ # relation.push(doc)
77
+ # end
78
+ #
79
+ # @return [ Object ] The return value of the block.
80
+ #
81
+ # @since 2.1.0
82
+ def _building
83
+ Threaded.begin_build
84
+ yield
85
+ ensure
86
+ Threaded.exit_build
87
+ end
88
+
89
+ # Is the current thread in building mode?
90
+ #
91
+ # @example Is the current thread in building mode?
92
+ # proxy._building?
93
+ #
94
+ # @return [ true, false ] If the thread is building.
95
+ #
96
+ # @since 2.1.0
97
+ def _building?
98
+ Threaded.building?
99
+ end
100
+
101
+ # Is the current thread in creating mode?
102
+ #
103
+ # @example Is the current thread in creating mode?
104
+ # proxy.creating?
105
+ #
106
+ # @return [ true, false ] If the thread is creating.
107
+ #
108
+ # @since 2.1.0
109
+ def _creating?
110
+ Threaded.creating?
111
+ end
112
+
113
+ # Execute a block in loading mode.
114
+ #
115
+ # @example Execute in loading mode.
116
+ # _loading do
117
+ # relation.push(doc)
118
+ # end
119
+ #
120
+ # @return [ Object ] The return value of the block.
121
+ #
122
+ # @since 2.3.2
123
+ def _loading
124
+ Threaded.begin_load
125
+ yield
126
+ ensure
127
+ Threaded.exit_load
128
+ end
129
+
130
+ # Is the current thread in loading mode?
131
+ #
132
+ # @example Is the current thread in loading mode?
133
+ # proxy._loading?
134
+ #
135
+ # @return [ true, false ] If the thread is loading.
136
+ #
137
+ # @since 2.3.2
138
+ def _loading?
139
+ Threaded.loading?
140
+ end
141
+
142
+ # Execute a block in loading revision mode.
143
+ #
144
+ # @example Execute in loading revision mode.
145
+ # _loading_revision do
146
+ # load_revision
147
+ # end
148
+ #
149
+ # @return [ Object ] The return value of the block.
150
+ #
151
+ # @since 2.3.4
152
+ def _loading_revision
153
+ Threaded.begin_load_revision
154
+ yield
155
+ ensure
156
+ Threaded.exit_load_revision
157
+ end
158
+
159
+ module ClassMethods #:nodoc:
160
+
161
+ # Execute a block in creating mode.
162
+ #
163
+ # @example Execute in creating mode.
164
+ # creating do
165
+ # relation.push(doc)
166
+ # end
167
+ #
168
+ # @return [ Object ] The return value of the block.
169
+ #
170
+ # @since 2.1.0
171
+ def _creating
172
+ Threaded.begin_create
173
+ yield
174
+ ensure
175
+ Threaded.exit_create
176
+ end
177
+
178
+ # Is the current thread in loading revision mode?
179
+ #
180
+ # @example Is the current thread in loading revision mode?
181
+ # proxy._loading_revision?
182
+ #
183
+ # @return [ true, false ] If the thread is loading a revision.
184
+ #
185
+ # @since 2.3.4
186
+ def _loading_revision?
187
+ Threaded.loading_revision?
188
+ end
189
+ end
190
+ end
191
+ end
192
+ end
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+ require "mongoid/timestamps/created"
3
+ require "mongoid/timestamps/updated"
4
+ require "mongoid/timestamps/timeless"
5
+
6
+ module Mongoid #:nodoc:
7
+
8
+ # This module handles the behaviour for setting up document created at and
9
+ # updated at timestamps.
10
+ module Timestamps
11
+ extend ActiveSupport::Concern
12
+ include Created
13
+ include Updated
14
+ end
15
+ end
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Timestamps
4
+ # This module handles the behaviour for setting up document created at
5
+ # timestamp.
6
+ module Created
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ field :created_at, :type => Time
11
+ set_callback :create, :before, :set_created_at, :if => :timestamping?
12
+ end
13
+
14
+ # Update the created_at field on the Document to the current time. This is
15
+ # only called on create.
16
+ #
17
+ # @example Set the created at time.
18
+ # person.set_created_at
19
+ def set_created_at
20
+ self.created_at = Time.now.utc if !created_at
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Timestamps
4
+
5
+ # This module adds behaviour for turning off timestamping in single or
6
+ # multiple calls.
7
+ module Timeless
8
+ extend ActiveSupport::Concern
9
+
10
+ # Begin an execution that should skip timestamping.
11
+ #
12
+ # @example Save a document but don't timestamp.
13
+ # person.timeless.save
14
+ #
15
+ # @return [ Document ] The document this was called on.
16
+ #
17
+ # @since 2.3.0
18
+ def timeless
19
+ tap { Threaded.timeless = true }
20
+ end
21
+
22
+ # Are we currently timestamping?
23
+ #
24
+ # @example Should timestamps be applied?
25
+ # person.timestamping?
26
+ #
27
+ # @return [ true, false ] If the current thread is timestamping.
28
+ #
29
+ # @since 2.3.0
30
+ def timestamping?
31
+ Threaded.timestamping?
32
+ end
33
+
34
+ module ClassMethods #:nodoc
35
+
36
+ # Begin an execution that should skip timestamping.
37
+ #
38
+ # @example Create a document but don't timestamp.
39
+ # Person.timeless.create(:title => "Sir")
40
+ #
41
+ # @return [ Class ] The class this was called on.
42
+ #
43
+ # @since 2.3.0
44
+ def timeless
45
+ tap { Threaded.timeless = true }
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Timestamps
4
+ # This module handles the behaviour for setting up document updated at
5
+ # timestamp.
6
+ module Updated
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ field :updated_at, :type => Time, :versioned => false
11
+ set_callback :save, :before, :set_updated_at, :if => Proc.new { |doc|
12
+ doc.timestamping? && (doc.new_record? || doc.changed?)
13
+ }
14
+ end
15
+
16
+ # Update the updated_at field on the Document to the current time.
17
+ # This is only called on create and on save.
18
+ #
19
+ # @example Set the updated at time.
20
+ # person.set_updated_at
21
+ def set_updated_at
22
+ self.updated_at = Time.now.utc unless updated_at_changed?
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,140 @@
1
+ # encoding: utf-8
2
+ require "mongoid/validations/associated"
3
+ require "mongoid/validations/uniqueness"
4
+
5
+ module Mongoid #:nodoc:
6
+
7
+ # This module provides additional validations that ActiveModel does not
8
+ # provide: validates_associated and validates_uniqueness_of.
9
+ module Validations
10
+ extend ActiveSupport::Concern
11
+ include ActiveModel::Validations
12
+
13
+ # Begin the associated validation.
14
+ #
15
+ # @example Begin validation.
16
+ # document.begin_validate
17
+ #
18
+ # @since 2.1.9
19
+ def begin_validate
20
+ Threaded.begin_validate(self)
21
+ end
22
+
23
+ # Exit the associated validation.
24
+ #
25
+ # @example Exit validation.
26
+ # document.exit_validate
27
+ #
28
+ # @since 2.1.9
29
+ def exit_validate
30
+ Threaded.exit_validate(self)
31
+ end
32
+
33
+ # Overrides the default ActiveModel behaviour since we need to handle
34
+ # validations of relations slightly different than just calling the
35
+ # getter.
36
+ #
37
+ # @example Read the value.
38
+ # person.read_attribute_for_validation(:addresses)
39
+ #
40
+ # @param [ Symbol ] attr The name of the field or relation.
41
+ #
42
+ # @return [ Object ] The value of the field or the relation.
43
+ #
44
+ # @since 2.0.0.rc.1
45
+ def read_attribute_for_validation(attr)
46
+ if relations[attr.to_s]
47
+ begin_validate
48
+ relation = send(attr)
49
+ exit_validate
50
+ relation.do_or_do_not(:in_memory) || relation
51
+ else
52
+ send(attr)
53
+ end
54
+ end
55
+
56
+ # Determine if the document is valid.
57
+ #
58
+ # @example Is the document valid?
59
+ # person.valid?
60
+ #
61
+ # @example Is the document valid in a context?
62
+ # person.valid?(:create)
63
+ #
64
+ # @param [ Symbol ] context The optional validation context.
65
+ #
66
+ # @return [ true, false ] True if valid, false if not.
67
+ #
68
+ # @since 2.0.0.rc.6
69
+ def valid?(context = nil)
70
+ super context ? context : (new? ? :create : :update)
71
+ end
72
+
73
+ # Used to prevent infinite loops in associated validations.
74
+ #
75
+ # @example Is the document validated?
76
+ # document.validated?
77
+ #
78
+ # @return [ true, false ] Has the document already been validated?
79
+ #
80
+ # @since 2.0.0.rc.2
81
+ def validated?
82
+ Threaded.validated?(self)
83
+ end
84
+
85
+ module ClassMethods #:nodoc:
86
+
87
+ # Validates whether or not an association is valid or not. Will correctly
88
+ # handle has one and has many associations.
89
+ #
90
+ # @example
91
+ #
92
+ # class Person
93
+ # include Mongoid::Document
94
+ # embeds_one :name
95
+ # embeds_many :addresses
96
+ #
97
+ # validates_associated :name, :addresses
98
+ # end
99
+ #
100
+ # @param [ Array ] *args The arguments to pass to the validator.
101
+ def validates_associated(*args)
102
+ validates_with(AssociatedValidator, _merge_attributes(args))
103
+ end
104
+
105
+ # Validates whether or not a field is unique against the documents in the
106
+ # database.
107
+ #
108
+ # @example
109
+ #
110
+ # class Person
111
+ # include Mongoid::Document
112
+ # field :title
113
+ #
114
+ # validates_uniqueness_of :title
115
+ # end
116
+ #
117
+ # @param [ Array ] *args The arguments to pass to the validator.
118
+ def validates_uniqueness_of(*args)
119
+ validates_with(UniquenessValidator, _merge_attributes(args))
120
+ end
121
+
122
+ protected
123
+
124
+ # Adds an associated validator for the relation if the validate option
125
+ # was not provided or set to true.
126
+ #
127
+ # @example Set up validation.
128
+ # Person.validates_relation(metadata)
129
+ #
130
+ # @param [ Metadata ] metadata The relation metadata.
131
+ #
132
+ # @since 2.0.0.rc.1
133
+ def validates_relation(metadata)
134
+ if metadata.validate?
135
+ validates_associated(metadata.name)
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end