mongoid-locomotive 2.0.0.beta9

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 (274) hide show
  1. data/MIT_LICENSE +20 -0
  2. data/README.rdoc +47 -0
  3. data/lib/mongoid.rb +141 -0
  4. data/lib/mongoid/associations.rb +306 -0
  5. data/lib/mongoid/associations/embedded_in.rb +74 -0
  6. data/lib/mongoid/associations/embeds_many.rb +280 -0
  7. data/lib/mongoid/associations/embeds_one.rb +97 -0
  8. data/lib/mongoid/associations/foreign_key.rb +35 -0
  9. data/lib/mongoid/associations/meta_data.rb +38 -0
  10. data/lib/mongoid/associations/options.rb +62 -0
  11. data/lib/mongoid/associations/proxy.rb +33 -0
  12. data/lib/mongoid/associations/referenced_in.rb +59 -0
  13. data/lib/mongoid/associations/references_many.rb +245 -0
  14. data/lib/mongoid/associations/references_many_as_array.rb +78 -0
  15. data/lib/mongoid/associations/references_one.rb +99 -0
  16. data/lib/mongoid/atomicity.rb +55 -0
  17. data/lib/mongoid/attributes.rb +242 -0
  18. data/lib/mongoid/callbacks.rb +21 -0
  19. data/lib/mongoid/collection.rb +120 -0
  20. data/lib/mongoid/collections.rb +71 -0
  21. data/lib/mongoid/collections/cyclic_iterator.rb +34 -0
  22. data/lib/mongoid/collections/master.rb +29 -0
  23. data/lib/mongoid/collections/operations.rb +41 -0
  24. data/lib/mongoid/collections/slaves.rb +45 -0
  25. data/lib/mongoid/components.rb +34 -0
  26. data/lib/mongoid/config.rb +263 -0
  27. data/lib/mongoid/contexts.rb +24 -0
  28. data/lib/mongoid/contexts/enumerable.rb +156 -0
  29. data/lib/mongoid/contexts/ids.rb +25 -0
  30. data/lib/mongoid/contexts/mongo.rb +285 -0
  31. data/lib/mongoid/contexts/paging.rb +50 -0
  32. data/lib/mongoid/criteria.rb +248 -0
  33. data/lib/mongoid/criterion/complex.rb +21 -0
  34. data/lib/mongoid/criterion/exclusion.rb +65 -0
  35. data/lib/mongoid/criterion/inclusion.rb +110 -0
  36. data/lib/mongoid/criterion/optional.rb +189 -0
  37. data/lib/mongoid/cursor.rb +81 -0
  38. data/lib/mongoid/deprecation.rb +21 -0
  39. data/lib/mongoid/dirty.rb +252 -0
  40. data/lib/mongoid/document.rb +210 -0
  41. data/lib/mongoid/errors.rb +131 -0
  42. data/lib/mongoid/extensions.rb +115 -0
  43. data/lib/mongoid/extensions/array/accessors.rb +17 -0
  44. data/lib/mongoid/extensions/array/assimilation.rb +26 -0
  45. data/lib/mongoid/extensions/array/conversions.rb +23 -0
  46. data/lib/mongoid/extensions/array/parentization.rb +13 -0
  47. data/lib/mongoid/extensions/big_decimal/conversions.rb +19 -0
  48. data/lib/mongoid/extensions/binary/conversions.rb +17 -0
  49. data/lib/mongoid/extensions/boolean/conversions.rb +27 -0
  50. data/lib/mongoid/extensions/date/conversions.rb +24 -0
  51. data/lib/mongoid/extensions/datetime/conversions.rb +12 -0
  52. data/lib/mongoid/extensions/false_class/equality.rb +13 -0
  53. data/lib/mongoid/extensions/float/conversions.rb +20 -0
  54. data/lib/mongoid/extensions/hash/accessors.rb +42 -0
  55. data/lib/mongoid/extensions/hash/assimilation.rb +40 -0
  56. data/lib/mongoid/extensions/hash/conversions.rb +42 -0
  57. data/lib/mongoid/extensions/hash/criteria_helpers.rb +20 -0
  58. data/lib/mongoid/extensions/hash/scoping.rb +12 -0
  59. data/lib/mongoid/extensions/integer/conversions.rb +20 -0
  60. data/lib/mongoid/extensions/nil/assimilation.rb +17 -0
  61. data/lib/mongoid/extensions/object/conversions.rb +21 -0
  62. data/lib/mongoid/extensions/objectid/conversions.rb +15 -0
  63. data/lib/mongoid/extensions/proc/scoping.rb +12 -0
  64. data/lib/mongoid/extensions/set/conversions.rb +20 -0
  65. data/lib/mongoid/extensions/string/conversions.rb +15 -0
  66. data/lib/mongoid/extensions/string/inflections.rb +97 -0
  67. data/lib/mongoid/extensions/symbol/inflections.rb +40 -0
  68. data/lib/mongoid/extensions/time_conversions.rb +35 -0
  69. data/lib/mongoid/extensions/true_class/equality.rb +13 -0
  70. data/lib/mongoid/extras.rb +61 -0
  71. data/lib/mongoid/factory.rb +20 -0
  72. data/lib/mongoid/field.rb +83 -0
  73. data/lib/mongoid/fields.rb +62 -0
  74. data/lib/mongoid/finders.rb +145 -0
  75. data/lib/mongoid/hierarchy.rb +74 -0
  76. data/lib/mongoid/identity.rb +47 -0
  77. data/lib/mongoid/indexes.rb +27 -0
  78. data/lib/mongoid/javascript.rb +21 -0
  79. data/lib/mongoid/javascript/functions.yml +37 -0
  80. data/lib/mongoid/logger.rb +19 -0
  81. data/lib/mongoid/matchers.rb +35 -0
  82. data/lib/mongoid/matchers/all.rb +11 -0
  83. data/lib/mongoid/matchers/default.rb +26 -0
  84. data/lib/mongoid/matchers/exists.rb +13 -0
  85. data/lib/mongoid/matchers/gt.rb +11 -0
  86. data/lib/mongoid/matchers/gte.rb +11 -0
  87. data/lib/mongoid/matchers/in.rb +11 -0
  88. data/lib/mongoid/matchers/lt.rb +11 -0
  89. data/lib/mongoid/matchers/lte.rb +11 -0
  90. data/lib/mongoid/matchers/ne.rb +11 -0
  91. data/lib/mongoid/matchers/nin.rb +11 -0
  92. data/lib/mongoid/matchers/size.rb +11 -0
  93. data/lib/mongoid/memoization.rb +33 -0
  94. data/lib/mongoid/named_scope.rb +37 -0
  95. data/lib/mongoid/paranoia.rb +106 -0
  96. data/lib/mongoid/paths.rb +61 -0
  97. data/lib/mongoid/persistence.rb +216 -0
  98. data/lib/mongoid/persistence/command.rb +39 -0
  99. data/lib/mongoid/persistence/insert.rb +48 -0
  100. data/lib/mongoid/persistence/insert_embedded.rb +44 -0
  101. data/lib/mongoid/persistence/remove.rb +39 -0
  102. data/lib/mongoid/persistence/remove_all.rb +38 -0
  103. data/lib/mongoid/persistence/remove_embedded.rb +50 -0
  104. data/lib/mongoid/persistence/update.rb +71 -0
  105. data/lib/mongoid/railtie.rb +67 -0
  106. data/lib/mongoid/railties/database.rake +60 -0
  107. data/lib/mongoid/scope.rb +75 -0
  108. data/lib/mongoid/state.rb +32 -0
  109. data/lib/mongoid/timestamps.rb +27 -0
  110. data/lib/mongoid/validations.rb +51 -0
  111. data/lib/mongoid/validations/associated.rb +32 -0
  112. data/lib/mongoid/validations/locale/en.yml +5 -0
  113. data/lib/mongoid/validations/uniqueness.rb +56 -0
  114. data/lib/mongoid/version.rb +4 -0
  115. data/lib/mongoid/versioning.rb +26 -0
  116. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  117. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +24 -0
  118. data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
  119. data/lib/rails/generators/mongoid/model/templates/model.rb +15 -0
  120. data/lib/rails/generators/mongoid_generator.rb +61 -0
  121. data/spec/integration/mongoid/association_attributes_spec.rb +71 -0
  122. data/spec/integration/mongoid/associations_spec.rb +768 -0
  123. data/spec/integration/mongoid/attributes_spec.rb +59 -0
  124. data/spec/integration/mongoid/callback_spec.rb +33 -0
  125. data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
  126. data/spec/integration/mongoid/criteria_spec.rb +281 -0
  127. data/spec/integration/mongoid/dirty_spec.rb +85 -0
  128. data/spec/integration/mongoid/document_spec.rb +741 -0
  129. data/spec/integration/mongoid/extensions_spec.rb +22 -0
  130. data/spec/integration/mongoid/finders_spec.rb +119 -0
  131. data/spec/integration/mongoid/inheritance_spec.rb +171 -0
  132. data/spec/integration/mongoid/named_scope_spec.rb +58 -0
  133. data/spec/integration/mongoid/paranoia_spec.rb +44 -0
  134. data/spec/integration/mongoid/persistence/update_spec.rb +46 -0
  135. data/spec/integration/mongoid/persistence_spec.rb +311 -0
  136. data/spec/integration/mongoid/validations/uniqueness_spec.rb +206 -0
  137. data/spec/models/account.rb +5 -0
  138. data/spec/models/address.rb +40 -0
  139. data/spec/models/agent.rb +7 -0
  140. data/spec/models/animal.rb +15 -0
  141. data/spec/models/answer.rb +4 -0
  142. data/spec/models/callbacks.rb +47 -0
  143. data/spec/models/category.rb +13 -0
  144. data/spec/models/comment.rb +10 -0
  145. data/spec/models/country_code.rb +6 -0
  146. data/spec/models/employer.rb +5 -0
  147. data/spec/models/favorite.rb +8 -0
  148. data/spec/models/game.rb +9 -0
  149. data/spec/models/inheritance.rb +72 -0
  150. data/spec/models/location.rb +5 -0
  151. data/spec/models/login.rb +6 -0
  152. data/spec/models/mixed_drink.rb +4 -0
  153. data/spec/models/name.rb +13 -0
  154. data/spec/models/namespacing.rb +11 -0
  155. data/spec/models/paranoid_post.rb +18 -0
  156. data/spec/models/parents.rb +32 -0
  157. data/spec/models/patient.rb +15 -0
  158. data/spec/models/person.rb +106 -0
  159. data/spec/models/pet.rb +7 -0
  160. data/spec/models/pet_owner.rb +6 -0
  161. data/spec/models/phone.rb +7 -0
  162. data/spec/models/post.rb +25 -0
  163. data/spec/models/preference.rb +7 -0
  164. data/spec/models/question.rb +8 -0
  165. data/spec/models/survey.rb +6 -0
  166. data/spec/models/translation.rb +5 -0
  167. data/spec/models/user.rb +6 -0
  168. data/spec/models/user_accout.rb +5 -0
  169. data/spec/models/vet_visit.rb +5 -0
  170. data/spec/models/video.rb +5 -0
  171. data/spec/spec_helper.rb +33 -0
  172. data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
  173. data/spec/unit/mongoid/associations/embeds_many_spec.rb +626 -0
  174. data/spec/unit/mongoid/associations/embeds_one_spec.rb +287 -0
  175. data/spec/unit/mongoid/associations/foreign_key_spec.rb +90 -0
  176. data/spec/unit/mongoid/associations/meta_data_spec.rb +110 -0
  177. data/spec/unit/mongoid/associations/options_spec.rb +215 -0
  178. data/spec/unit/mongoid/associations/referenced_in_spec.rb +145 -0
  179. data/spec/unit/mongoid/associations/references_many_as_array_spec.rb +424 -0
  180. data/spec/unit/mongoid/associations/references_many_spec.rb +502 -0
  181. data/spec/unit/mongoid/associations/references_one_spec.rb +204 -0
  182. data/spec/unit/mongoid/associations_spec.rb +688 -0
  183. data/spec/unit/mongoid/atomicity_spec.rb +164 -0
  184. data/spec/unit/mongoid/attributes_spec.rb +646 -0
  185. data/spec/unit/mongoid/callbacks_spec.rb +85 -0
  186. data/spec/unit/mongoid/collection_spec.rb +187 -0
  187. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
  188. data/spec/unit/mongoid/collections/master_spec.rb +41 -0
  189. data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
  190. data/spec/unit/mongoid/collections_spec.rb +98 -0
  191. data/spec/unit/mongoid/config_spec.rb +298 -0
  192. data/spec/unit/mongoid/contexts/enumerable_spec.rb +447 -0
  193. data/spec/unit/mongoid/contexts/mongo_spec.rb +703 -0
  194. data/spec/unit/mongoid/contexts_spec.rb +25 -0
  195. data/spec/unit/mongoid/criteria_spec.rb +873 -0
  196. data/spec/unit/mongoid/criterion/complex_spec.rb +17 -0
  197. data/spec/unit/mongoid/criterion/exclusion_spec.rb +121 -0
  198. data/spec/unit/mongoid/criterion/inclusion_spec.rb +274 -0
  199. data/spec/unit/mongoid/criterion/optional_spec.rb +483 -0
  200. data/spec/unit/mongoid/cursor_spec.rb +80 -0
  201. data/spec/unit/mongoid/deprecation_spec.rb +24 -0
  202. data/spec/unit/mongoid/dirty_spec.rb +430 -0
  203. data/spec/unit/mongoid/document_spec.rb +623 -0
  204. data/spec/unit/mongoid/errors_spec.rb +154 -0
  205. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
  206. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
  207. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +52 -0
  208. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
  209. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +36 -0
  210. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
  211. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
  212. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +145 -0
  213. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +14 -0
  214. data/spec/unit/mongoid/extensions/false_class/equality_spec.rb +35 -0
  215. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
  216. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
  217. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +59 -0
  218. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +35 -0
  219. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
  220. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
  221. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
  222. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +29 -0
  223. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +44 -0
  224. data/spec/unit/mongoid/extensions/objectid/conversions_spec.rb +22 -0
  225. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
  226. data/spec/unit/mongoid/extensions/set/conversions_spec.rb +21 -0
  227. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +28 -0
  228. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
  229. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +107 -0
  230. data/spec/unit/mongoid/extensions/time_conversions_spec.rb +186 -0
  231. data/spec/unit/mongoid/extensions/true_class/equality_spec.rb +35 -0
  232. data/spec/unit/mongoid/extras_spec.rb +102 -0
  233. data/spec/unit/mongoid/factory_spec.rb +31 -0
  234. data/spec/unit/mongoid/field_spec.rb +169 -0
  235. data/spec/unit/mongoid/fields_spec.rb +181 -0
  236. data/spec/unit/mongoid/finders_spec.rb +439 -0
  237. data/spec/unit/mongoid/hierarchy_spec.rb +68 -0
  238. data/spec/unit/mongoid/identity_spec.rb +109 -0
  239. data/spec/unit/mongoid/indexes_spec.rb +99 -0
  240. data/spec/unit/mongoid/javascript_spec.rb +48 -0
  241. data/spec/unit/mongoid/logger_spec.rb +38 -0
  242. data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
  243. data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
  244. data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
  245. data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
  246. data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
  247. data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
  248. data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
  249. data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
  250. data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
  251. data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
  252. data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
  253. data/spec/unit/mongoid/matchers_spec.rb +329 -0
  254. data/spec/unit/mongoid/memoization_spec.rb +75 -0
  255. data/spec/unit/mongoid/named_scope_spec.rb +123 -0
  256. data/spec/unit/mongoid/paranoia_spec.rb +108 -0
  257. data/spec/unit/mongoid/paths_spec.rb +272 -0
  258. data/spec/unit/mongoid/persistence/insert_embedded_spec.rb +154 -0
  259. data/spec/unit/mongoid/persistence/insert_spec.rb +144 -0
  260. data/spec/unit/mongoid/persistence/remove_all_spec.rb +82 -0
  261. data/spec/unit/mongoid/persistence/remove_embedded_spec.rb +152 -0
  262. data/spec/unit/mongoid/persistence/remove_spec.rb +89 -0
  263. data/spec/unit/mongoid/persistence/update_spec.rb +177 -0
  264. data/spec/unit/mongoid/persistence_spec.rb +452 -0
  265. data/spec/unit/mongoid/scope_spec.rb +240 -0
  266. data/spec/unit/mongoid/serialization_spec.rb +43 -0
  267. data/spec/unit/mongoid/state_spec.rb +94 -0
  268. data/spec/unit/mongoid/timestamps_spec.rb +30 -0
  269. data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
  270. data/spec/unit/mongoid/validations/uniqueness_spec.rb +201 -0
  271. data/spec/unit/mongoid/validations_spec.rb +43 -0
  272. data/spec/unit/mongoid/versioning_spec.rb +41 -0
  273. data/spec/unit/mongoid_spec.rb +46 -0
  274. metadata +433 -0
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Extensions #:nodoc:
4
+ module ObjectID #:nodoc:
5
+ module Conversions #:nodoc:
6
+ def set(value)
7
+ value
8
+ end
9
+ def get(value)
10
+ value
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Extensions #:nodoc:
4
+ module Proc #:nodoc:
5
+ module Scoping #:nodoc:
6
+ def scoped(*args)
7
+ call(*args).scoped
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Extensions #:nodoc:
4
+ module Set #:nodoc:
5
+ # This module converts set into mongoid related objects.
6
+ module Conversions #:nodoc:
7
+ extend ActiveSupport::Concern
8
+
9
+ module ClassMethods #:nodoc:
10
+ def get(value)
11
+ ::Set.new(value)
12
+ end
13
+ def set(value)
14
+ value
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Extensions #:nodoc:
4
+ module String #:nodoc:
5
+ module Conversions #:nodoc:
6
+ def set(value)
7
+ value.to_s unless value.nil?
8
+ end
9
+ def get(value)
10
+ value
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,97 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Extensions #:nodoc:
4
+ module String #:nodoc:
5
+ module Inflections #:nodoc:
6
+
7
+ ActiveSupport::Inflector.inflections do |inflect|
8
+ inflect.singular("address", "address")
9
+ inflect.singular("addresses", "address")
10
+ inflect.irregular("canvas", "canvases")
11
+ end
12
+
13
+ # Represents how special characters will get converted when creating a
14
+ # composite key that should be unique and part of a url.
15
+ CHAR_CONV = {
16
+ " " => "-",
17
+ "!" => "-excl-",
18
+ "\"" => "-bckslsh-",
19
+ "#" => "-hash-",
20
+ "$" => "-dol-",
21
+ "%" => "-perc-",
22
+ "&" => "-and-",
23
+ "'" => "-quo-",
24
+ "(" => "-oparen-",
25
+ ")" => "-cparen-",
26
+ "*" => "-astx-",
27
+ "+" => "-plus-",
28
+ "," => "-comma-",
29
+ "-" => "-dash-",
30
+ "." => "-period-",
31
+ "/" => "-fwdslsh-",
32
+ ":" => "-colon-",
33
+ ";" => "-semicol-",
34
+ "<" => "-lt-",
35
+ "=" => "-eq-",
36
+ ">" => "-gt-",
37
+ "?" => "-ques-",
38
+ "@" => "-at-",
39
+ "[" => "-obrck-",
40
+ "\\" => "-bckslsh-",
41
+ "]" => "-clbrck-",
42
+ "^" => "-carat-",
43
+ "_" => "-undscr-",
44
+ "`" => "-bcktick-",
45
+ "{" => "-ocurly-",
46
+ "|" => "-pipe-",
47
+ "}" => "-clcurly-",
48
+ "~" => "-tilda-"
49
+ }
50
+
51
+ REVERSALS = {
52
+ "asc" => "desc",
53
+ "ascending" => "descending",
54
+ "desc" => "asc",
55
+ "descending" => "ascending"
56
+ }
57
+
58
+ def collectionize
59
+ tableize.gsub("/", "_")
60
+ end
61
+
62
+ def identify
63
+ if Mongoid.parameterize_keys
64
+ key = ""
65
+ each_char { |c| key += (CHAR_CONV[c] || c.downcase) }; key
66
+ else
67
+ self
68
+ end
69
+ end
70
+
71
+ def labelize
72
+ underscore.humanize
73
+ end
74
+
75
+ def invert
76
+ REVERSALS[self]
77
+ end
78
+
79
+ def singular?
80
+ singularize == self
81
+ end
82
+
83
+ def plural?
84
+ pluralize == self
85
+ end
86
+
87
+ def reader
88
+ writer? ? gsub("=", "") : self
89
+ end
90
+
91
+ def writer?
92
+ include?("=")
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Extensions #:nodoc:
4
+ module Symbol #:nodoc:
5
+ module Inflections #:nodoc:
6
+
7
+ REVERSALS = {
8
+ :asc => :desc,
9
+ :ascending => :descending,
10
+ :desc => :asc,
11
+ :descending => :ascending
12
+ }
13
+
14
+ def invert
15
+ REVERSALS[self]
16
+ end
17
+
18
+ def singular?
19
+ to_s.singular?
20
+ end
21
+
22
+ def plural?
23
+ to_s.plural?
24
+ end
25
+
26
+ [ "asc", "ascending", "desc", "descending", "gt", "lt", "gte",
27
+ "lte", "ne", "near", "in", "nin", "mod", "all", "size", "exists",
28
+ "within", ["matches","elemMatch"] ].each do |oper|
29
+ m, oper = oper
30
+ oper = m unless oper
31
+ class_eval <<-OPERATORS
32
+ def #{m}
33
+ Criterion::Complex.new(:key => self, :operator => "#{oper}")
34
+ end
35
+ OPERATORS
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,35 @@
1
+ module Mongoid #:nodoc:
2
+ module Extensions #:nodoc:
3
+ module TimeConversions #:nodoc:
4
+ def set(value)
5
+ return nil if value.blank?
6
+ time = convert_to_time(value)
7
+ strip_milliseconds(time).utc
8
+ end
9
+
10
+ def get(value)
11
+ return nil if value.blank?
12
+ if Mongoid::Config.instance.use_utc?
13
+ value
14
+ else
15
+ value.getlocal
16
+ end
17
+ end
18
+
19
+ protected
20
+
21
+ def strip_milliseconds(time)
22
+ ::Time.at(time.to_i)
23
+ end
24
+
25
+ def convert_to_time(value)
26
+ case value
27
+ when ::String then ::Time.parse(value)
28
+ when ::DateTime then ::Time.utc(value.year, value.month, value.day, value.hour, value.min, value.sec)
29
+ when ::Date then ::Time.utc(value.year, value.month, value.day)
30
+ else value
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Extensions #:nodoc:
4
+ module TrueClass #:nodoc:
5
+ module Equality #:nodoc:
6
+ def is_a?(other)
7
+ return true if other.name == "Boolean"
8
+ super(other)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,61 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Extras #:nodoc:
4
+ extend ActiveSupport::Concern
5
+ included do
6
+ class_inheritable_accessor :cached, :enslaved
7
+ self.cached = false
8
+ self.enslaved = false
9
+ delegate :cached?, :enslaved?, :to => "self.class"
10
+ end
11
+
12
+ module ClassMethods #:nodoc
13
+ # Sets caching on for this class. This class level configuration will
14
+ # default all queries to cache the results of the first iteration over
15
+ # the cursor into an internal array. This should only be used for queries
16
+ # that return a small number of results or have small documents, as after
17
+ # the first iteration the entire results will be stored in memory.
18
+ #
19
+ # Example:
20
+ #
21
+ # class Person
22
+ # include Mongoid::Document
23
+ # cache
24
+ # end
25
+ def cache
26
+ self.cached = true
27
+ end
28
+
29
+ # Determines if the class is cached or not.
30
+ #
31
+ # Returns:
32
+ #
33
+ # True if cached, false if not.
34
+ def cached?
35
+ !!self.cached
36
+ end
37
+
38
+ # Set whether or not this documents read operations should delegate to
39
+ # the slave database by default.
40
+ #
41
+ # Example:
42
+ #
43
+ # class Person
44
+ # include Mongoid::Document
45
+ # enslave
46
+ # end
47
+ def enslave
48
+ self.enslaved = true
49
+ end
50
+
51
+ # Determines if the class is enslaved or not.
52
+ #
53
+ # Returns:
54
+ #
55
+ # True if enslaved, false if not.
56
+ def enslaved?
57
+ !!self.enslaved
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ class Factory #:nodoc:
4
+ # Builds a new +Document+ from the supplied attributes.
5
+ #
6
+ # Example:
7
+ #
8
+ # <tt>Mongoid::Factory.build(Person, {})</tt>
9
+ #
10
+ # Options:
11
+ #
12
+ # klass: The class to instantiate from if _type is not present.
13
+ # attributes: The +Document+ attributes.
14
+ def self.build(klass, attributes)
15
+ attrs = {}.merge(attributes)
16
+ type = attrs["_type"]
17
+ type ? type.constantize.instantiate(attrs) : klass.instantiate(attrs)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,83 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ class Field
4
+ attr_reader :name, :type
5
+
6
+ # Determine if the field is able to be accessible via a mass update.
7
+ #
8
+ # Returns:
9
+ #
10
+ # true if accessible, false if not.
11
+ def accessible?
12
+ !!@accessible
13
+ end
14
+
15
+ # Get the declared options for this field
16
+ #
17
+ # Returns:
18
+ #
19
+ # a hash of options
20
+ def options
21
+ @options
22
+ end
23
+
24
+ # Get the default value for the field.
25
+ #
26
+ # Returns:
27
+ #
28
+ # The primitive value or a copy of the default.
29
+ def default
30
+ copy
31
+ end
32
+
33
+ # Create the new field with a name and optional additional options. Valid
34
+ # options are :default
35
+ #
36
+ # Options:
37
+ #
38
+ # name: The name of the field as a +Symbol+.
39
+ # options: A +Hash+ of options for the field.
40
+ #
41
+ # Example:
42
+ #
43
+ # <tt>Field.new(:score, :default => 0)</tt>
44
+ def initialize(name, options = {})
45
+ check_name!(name)
46
+ @type = options[:type] || String
47
+ @name, @default = name, options[:default]
48
+ @copyable = (@default.is_a?(Array) || @default.is_a?(Hash))
49
+ @accessible = options.has_key?(:accessible) ? options[:accessible] : true
50
+ @options = options
51
+ check_default!
52
+ end
53
+
54
+ # Used for setting an object in the attributes hash. If nil is provided the
55
+ # default will get returned if it exists.
56
+ def set(object)
57
+ type.set(object)
58
+ end
59
+
60
+ # Used for retrieving the object out of the attributes hash.
61
+ def get(object)
62
+ type.get(object)
63
+ end
64
+
65
+ protected
66
+ # Slightly faster default check.
67
+ def copy
68
+ @copyable ? @default.dup : @default
69
+ end
70
+
71
+ # Check if the name is valid.
72
+ def check_name!(name)
73
+ raise Mongoid::Errors::InvalidField.new(name) if Mongoid.destructive_fields.include?(name.to_s)
74
+ end
75
+
76
+ def check_default!
77
+ return if @default.is_a?(Proc)
78
+ if !@default.nil? && !@default.is_a?(@type)
79
+ raise Mongoid::Errors::InvalidType.new(@type, @default)
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,62 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc
3
+ module Fields #:nodoc
4
+ extend ActiveSupport::Concern
5
+ included do
6
+ # Set up the class attributes that must be available to all subclasses.
7
+ # These include defaults, fields
8
+ class_inheritable_accessor :fields
9
+
10
+ self.fields = {}
11
+ delegate :defaults, :fields, :to => "self.class"
12
+ end
13
+
14
+ module ClassMethods #:nodoc
15
+ # Defines all the fields that are accessable on the Document
16
+ # For each field that is defined, a getter and setter will be
17
+ # added as an instance method to the Document.
18
+ #
19
+ # Options:
20
+ #
21
+ # name: The name of the field, as a +Symbol+.
22
+ # options: A +Hash+ of options to supply to the +Field+.
23
+ #
24
+ # Example:
25
+ #
26
+ # <tt>field :score, :default => 0</tt>
27
+ def field(name, options = {})
28
+ access = name.to_s
29
+ set_field(access, options)
30
+ attr_protected name if options[:accessible] == false
31
+ end
32
+
33
+ # Returns the default values for the fields on the document
34
+ def defaults
35
+ fields.inject({}) do |defs,(field_name,field)|
36
+ next(defs) if field.default.nil?
37
+ defs[field_name.to_s] = field.default
38
+ defs
39
+ end
40
+ end
41
+
42
+ protected
43
+ # Define a field attribute for the +Document+.
44
+ def set_field(name, options = {})
45
+ meth = options.delete(:as) || name
46
+ fields[name] = Field.new(name, options)
47
+ create_accessors(name, meth, options)
48
+ add_dirty_methods(name)
49
+ end
50
+
51
+ # Create the field accessors.
52
+ def create_accessors(name, meth, options = {})
53
+ define_method(meth) { read_attribute(name) }
54
+ define_method("#{meth}=") { |value| write_attribute(name, value) }
55
+ define_method("#{meth}?") do
56
+ attr = read_attribute(name)
57
+ (options[:type] == Boolean) ? attr == true : attr.present?
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end