mongoid-pre 2.0.0.beta1

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 (246) hide show
  1. data/.gitignore +6 -0
  2. data/.watchr +24 -0
  3. data/MIT_LICENSE +20 -0
  4. data/README.rdoc +49 -0
  5. data/Rakefile +52 -0
  6. data/VERSION +1 -0
  7. data/caliper.yml +4 -0
  8. data/lib/mongoid.rb +135 -0
  9. data/lib/mongoid/associations.rb +263 -0
  10. data/lib/mongoid/associations/belongs_to_related.rb +59 -0
  11. data/lib/mongoid/associations/embedded_in.rb +64 -0
  12. data/lib/mongoid/associations/embeds_many.rb +193 -0
  13. data/lib/mongoid/associations/embeds_one.rb +95 -0
  14. data/lib/mongoid/associations/has_many_related.rb +133 -0
  15. data/lib/mongoid/associations/has_one_related.rb +81 -0
  16. data/lib/mongoid/associations/meta_data.rb +28 -0
  17. data/lib/mongoid/associations/options.rb +52 -0
  18. data/lib/mongoid/associations/proxy.rb +31 -0
  19. data/lib/mongoid/attributes.rb +185 -0
  20. data/lib/mongoid/callbacks.rb +18 -0
  21. data/lib/mongoid/collection.rb +119 -0
  22. data/lib/mongoid/collections/cyclic_iterator.rb +34 -0
  23. data/lib/mongoid/collections/master.rb +28 -0
  24. data/lib/mongoid/collections/mimic.rb +46 -0
  25. data/lib/mongoid/collections/operations.rb +41 -0
  26. data/lib/mongoid/collections/slaves.rb +44 -0
  27. data/lib/mongoid/commands.rb +161 -0
  28. data/lib/mongoid/commands/create.rb +19 -0
  29. data/lib/mongoid/commands/delete.rb +16 -0
  30. data/lib/mongoid/commands/delete_all.rb +25 -0
  31. data/lib/mongoid/commands/deletion.rb +18 -0
  32. data/lib/mongoid/commands/destroy.rb +17 -0
  33. data/lib/mongoid/commands/destroy_all.rb +25 -0
  34. data/lib/mongoid/commands/save.rb +30 -0
  35. data/lib/mongoid/components.rb +31 -0
  36. data/lib/mongoid/config.rb +86 -0
  37. data/lib/mongoid/contexts.rb +25 -0
  38. data/lib/mongoid/contexts/enumerable.rb +151 -0
  39. data/lib/mongoid/contexts/ids.rb +25 -0
  40. data/lib/mongoid/contexts/mongo.rb +285 -0
  41. data/lib/mongoid/contexts/paging.rb +42 -0
  42. data/lib/mongoid/criteria.rb +239 -0
  43. data/lib/mongoid/criterion/complex.rb +21 -0
  44. data/lib/mongoid/criterion/exclusion.rb +65 -0
  45. data/lib/mongoid/criterion/inclusion.rb +93 -0
  46. data/lib/mongoid/criterion/optional.rb +136 -0
  47. data/lib/mongoid/cursor.rb +82 -0
  48. data/lib/mongoid/deprecation.rb +22 -0
  49. data/lib/mongoid/dirty.rb +203 -0
  50. data/lib/mongoid/document.rb +306 -0
  51. data/lib/mongoid/errors.rb +77 -0
  52. data/lib/mongoid/extensions.rb +99 -0
  53. data/lib/mongoid/extensions/array/accessors.rb +17 -0
  54. data/lib/mongoid/extensions/array/aliasing.rb +4 -0
  55. data/lib/mongoid/extensions/array/assimilation.rb +26 -0
  56. data/lib/mongoid/extensions/array/conversions.rb +27 -0
  57. data/lib/mongoid/extensions/array/parentization.rb +13 -0
  58. data/lib/mongoid/extensions/big_decimal/conversions.rb +19 -0
  59. data/lib/mongoid/extensions/binary/conversions.rb +17 -0
  60. data/lib/mongoid/extensions/boolean/conversions.rb +16 -0
  61. data/lib/mongoid/extensions/date/conversions.rb +15 -0
  62. data/lib/mongoid/extensions/datetime/conversions.rb +17 -0
  63. data/lib/mongoid/extensions/float/conversions.rb +16 -0
  64. data/lib/mongoid/extensions/hash/accessors.rb +38 -0
  65. data/lib/mongoid/extensions/hash/assimilation.rb +30 -0
  66. data/lib/mongoid/extensions/hash/conversions.rb +15 -0
  67. data/lib/mongoid/extensions/hash/criteria_helpers.rb +20 -0
  68. data/lib/mongoid/extensions/hash/scoping.rb +12 -0
  69. data/lib/mongoid/extensions/integer/conversions.rb +16 -0
  70. data/lib/mongoid/extensions/nil/assimilation.rb +13 -0
  71. data/lib/mongoid/extensions/object/conversions.rb +27 -0
  72. data/lib/mongoid/extensions/objectid/conversions.rb +15 -0
  73. data/lib/mongoid/extensions/proc/scoping.rb +12 -0
  74. data/lib/mongoid/extensions/string/conversions.rb +15 -0
  75. data/lib/mongoid/extensions/string/inflections.rb +97 -0
  76. data/lib/mongoid/extensions/symbol/inflections.rb +36 -0
  77. data/lib/mongoid/extensions/time/conversions.rb +18 -0
  78. data/lib/mongoid/extras.rb +61 -0
  79. data/lib/mongoid/factory.rb +19 -0
  80. data/lib/mongoid/field.rb +52 -0
  81. data/lib/mongoid/fields.rb +62 -0
  82. data/lib/mongoid/finders.rb +136 -0
  83. data/lib/mongoid/identity.rb +39 -0
  84. data/lib/mongoid/indexes.rb +27 -0
  85. data/lib/mongoid/javascript.rb +21 -0
  86. data/lib/mongoid/javascript/functions.yml +37 -0
  87. data/lib/mongoid/matchers.rb +36 -0
  88. data/lib/mongoid/matchers/all.rb +11 -0
  89. data/lib/mongoid/matchers/default.rb +26 -0
  90. data/lib/mongoid/matchers/exists.rb +13 -0
  91. data/lib/mongoid/matchers/gt.rb +11 -0
  92. data/lib/mongoid/matchers/gte.rb +11 -0
  93. data/lib/mongoid/matchers/in.rb +11 -0
  94. data/lib/mongoid/matchers/lt.rb +11 -0
  95. data/lib/mongoid/matchers/lte.rb +11 -0
  96. data/lib/mongoid/matchers/ne.rb +11 -0
  97. data/lib/mongoid/matchers/nin.rb +11 -0
  98. data/lib/mongoid/matchers/size.rb +11 -0
  99. data/lib/mongoid/memoization.rb +27 -0
  100. data/lib/mongoid/named_scope.rb +42 -0
  101. data/lib/mongoid/observable.rb +30 -0
  102. data/lib/mongoid/paths.rb +54 -0
  103. data/lib/mongoid/persistence.rb +27 -0
  104. data/lib/mongoid/persistence/command.rb +20 -0
  105. data/lib/mongoid/persistence/insert.rb +71 -0
  106. data/lib/mongoid/persistence/update.rb +78 -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 +4 -0
  113. data/lib/mongoid/validations/uniqueness.rb +22 -0
  114. data/lib/mongoid/versioning.rb +26 -0
  115. data/mongoid.gemspec +413 -0
  116. data/perf/benchmark.rb +77 -0
  117. data/spec/integration/mongoid/associations_spec.rb +340 -0
  118. data/spec/integration/mongoid/attributes_spec.rb +22 -0
  119. data/spec/integration/mongoid/commands_spec.rb +230 -0
  120. data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
  121. data/spec/integration/mongoid/criteria_spec.rb +272 -0
  122. data/spec/integration/mongoid/dirty_spec.rb +70 -0
  123. data/spec/integration/mongoid/document_spec.rb +650 -0
  124. data/spec/integration/mongoid/extensions_spec.rb +22 -0
  125. data/spec/integration/mongoid/finders_spec.rb +119 -0
  126. data/spec/integration/mongoid/inheritance_spec.rb +137 -0
  127. data/spec/integration/mongoid/named_scope_spec.rb +46 -0
  128. data/spec/integration/mongoid/persistence/update_spec.rb +46 -0
  129. data/spec/models/address.rb +39 -0
  130. data/spec/models/animal.rb +6 -0
  131. data/spec/models/callbacks.rb +18 -0
  132. data/spec/models/comment.rb +8 -0
  133. data/spec/models/country_code.rb +6 -0
  134. data/spec/models/employer.rb +5 -0
  135. data/spec/models/game.rb +7 -0
  136. data/spec/models/inheritance.rb +56 -0
  137. data/spec/models/location.rb +5 -0
  138. data/spec/models/mixed_drink.rb +4 -0
  139. data/spec/models/name.rb +13 -0
  140. data/spec/models/namespacing.rb +11 -0
  141. data/spec/models/patient.rb +6 -0
  142. data/spec/models/person.rb +99 -0
  143. data/spec/models/pet.rb +7 -0
  144. data/spec/models/pet_owner.rb +6 -0
  145. data/spec/models/phone.rb +7 -0
  146. data/spec/models/post.rb +15 -0
  147. data/spec/models/translation.rb +5 -0
  148. data/spec/models/vet_visit.rb +5 -0
  149. data/spec/spec.opts +3 -0
  150. data/spec/spec_helper.rb +31 -0
  151. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +145 -0
  152. data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
  153. data/spec/unit/mongoid/associations/embeds_many_spec.rb +516 -0
  154. data/spec/unit/mongoid/associations/embeds_one_spec.rb +282 -0
  155. data/spec/unit/mongoid/associations/has_many_related_spec.rb +418 -0
  156. data/spec/unit/mongoid/associations/has_one_related_spec.rb +179 -0
  157. data/spec/unit/mongoid/associations/meta_data_spec.rb +88 -0
  158. data/spec/unit/mongoid/associations/options_spec.rb +192 -0
  159. data/spec/unit/mongoid/associations_spec.rb +595 -0
  160. data/spec/unit/mongoid/attributes_spec.rb +507 -0
  161. data/spec/unit/mongoid/callbacks_spec.rb +55 -0
  162. data/spec/unit/mongoid/collection_spec.rb +187 -0
  163. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
  164. data/spec/unit/mongoid/collections/master_spec.rb +41 -0
  165. data/spec/unit/mongoid/collections/mimic_spec.rb +43 -0
  166. data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
  167. data/spec/unit/mongoid/commands/create_spec.rb +31 -0
  168. data/spec/unit/mongoid/commands/delete_all_spec.rb +59 -0
  169. data/spec/unit/mongoid/commands/delete_spec.rb +38 -0
  170. data/spec/unit/mongoid/commands/destroy_all_spec.rb +21 -0
  171. data/spec/unit/mongoid/commands/destroy_spec.rb +51 -0
  172. data/spec/unit/mongoid/commands/save_spec.rb +107 -0
  173. data/spec/unit/mongoid/commands_spec.rb +270 -0
  174. data/spec/unit/mongoid/config_spec.rb +176 -0
  175. data/spec/unit/mongoid/contexts/enumerable_spec.rb +421 -0
  176. data/spec/unit/mongoid/contexts/mongo_spec.rb +682 -0
  177. data/spec/unit/mongoid/contexts_spec.rb +25 -0
  178. data/spec/unit/mongoid/criteria_spec.rb +824 -0
  179. data/spec/unit/mongoid/criterion/complex_spec.rb +19 -0
  180. data/spec/unit/mongoid/criterion/exclusion_spec.rb +91 -0
  181. data/spec/unit/mongoid/criterion/inclusion_spec.rb +219 -0
  182. data/spec/unit/mongoid/criterion/optional_spec.rb +319 -0
  183. data/spec/unit/mongoid/cursor_spec.rb +74 -0
  184. data/spec/unit/mongoid/deprecation_spec.rb +24 -0
  185. data/spec/unit/mongoid/dirty_spec.rb +286 -0
  186. data/spec/unit/mongoid/document_spec.rb +818 -0
  187. data/spec/unit/mongoid/errors_spec.rb +103 -0
  188. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
  189. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
  190. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +35 -0
  191. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
  192. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +22 -0
  193. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
  194. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
  195. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +102 -0
  196. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +67 -0
  197. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
  198. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
  199. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +46 -0
  200. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +21 -0
  201. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
  202. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
  203. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
  204. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +24 -0
  205. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +57 -0
  206. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
  207. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +17 -0
  208. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
  209. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +91 -0
  210. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +70 -0
  211. data/spec/unit/mongoid/extras_spec.rb +102 -0
  212. data/spec/unit/mongoid/factory_spec.rb +31 -0
  213. data/spec/unit/mongoid/field_spec.rb +143 -0
  214. data/spec/unit/mongoid/fields_spec.rb +181 -0
  215. data/spec/unit/mongoid/finders_spec.rb +404 -0
  216. data/spec/unit/mongoid/identity_spec.rb +109 -0
  217. data/spec/unit/mongoid/indexes_spec.rb +93 -0
  218. data/spec/unit/mongoid/javascript_spec.rb +48 -0
  219. data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
  220. data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
  221. data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
  222. data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
  223. data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
  224. data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
  225. data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
  226. data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
  227. data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
  228. data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
  229. data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
  230. data/spec/unit/mongoid/matchers_spec.rb +329 -0
  231. data/spec/unit/mongoid/memoization_spec.rb +75 -0
  232. data/spec/unit/mongoid/named_scope_spec.rb +123 -0
  233. data/spec/unit/mongoid/observable_spec.rb +46 -0
  234. data/spec/unit/mongoid/paths_spec.rb +124 -0
  235. data/spec/unit/mongoid/persistence/insert_spec.rb +175 -0
  236. data/spec/unit/mongoid/persistence/update_spec.rb +148 -0
  237. data/spec/unit/mongoid/persistence_spec.rb +40 -0
  238. data/spec/unit/mongoid/scope_spec.rb +240 -0
  239. data/spec/unit/mongoid/state_spec.rb +83 -0
  240. data/spec/unit/mongoid/timestamps_spec.rb +25 -0
  241. data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
  242. data/spec/unit/mongoid/validations/uniqueness_spec.rb +47 -0
  243. data/spec/unit/mongoid/validations_spec.rb +190 -0
  244. data/spec/unit/mongoid/versioning_spec.rb +41 -0
  245. data/spec/unit/mongoid_spec.rb +46 -0
  246. metadata +476 -0
@@ -0,0 +1,6 @@
1
+ .DS_STORE
2
+ coverage/*
3
+ pkg/*
4
+ scratch_directory/*
5
+ tmp/*
6
+ *.gem
data/.watchr ADDED
@@ -0,0 +1,24 @@
1
+ # vim:set filetype=ruby:
2
+ def run(cmd)
3
+ puts cmd
4
+ system cmd
5
+ end
6
+
7
+ def spec(file)
8
+ if File.exists?(file)
9
+ run("spec -O spec/spec.opts #{file}")
10
+ else
11
+ puts("Spec: #{file} does not exist.")
12
+ end
13
+ end
14
+
15
+ watch("spec/.*/*_spec\.rb") do |match|
16
+ puts(match[0])
17
+ spec(match[0])
18
+ end
19
+
20
+ watch("lib/(.*/.*)\.rb") do |match|
21
+ puts(match[1])
22
+ spec("spec/unit/#{match[1]}_spec.rb")
23
+ spec("spec/integration/#{match[1]}_spec.rb")
24
+ end
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Durran Jordan
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,49 @@
1
+ = Overview
2
+
3
+ == About Mongoid
4
+
5
+ Mongoid is an ODM (Object-Document-Mapper) framework for MongoDB in Ruby.
6
+
7
+ == Project Tracking
8
+
9
+ * {Mongoid on Pivotal Tracker}[http://www.pivotaltracker.com/projects/27482]
10
+ * {Mongoid Google Group}[http://groups.google.com/group/mongoid]
11
+ * {Mongoid on CI Joe}[http://ci.mongoid.org/]
12
+ * {Mongoid Website and Documentation}[http://mongoid.org]
13
+
14
+ == Compatibility
15
+
16
+ Mongoid is developed against Ruby 1.8.6, 1.8.7, 1.9.1, 1.9.2
17
+
18
+ = Documentation
19
+
20
+ Please see the new Mongoid website for up-to-date documentation:
21
+ {mongoid.org}[http://mongoid.org]
22
+
23
+ = License
24
+
25
+ Copyright (c) 2009 Durran Jordan
26
+
27
+ Permission is hereby granted, free of charge, to any person obtaining
28
+ a copy of this software and associated documentation files (the
29
+ "Software"), to deal in the Software without restriction, including
30
+ without limitation the rights to use, copy, modify, merge, publish,
31
+ distribute, sublicense, and/or sell copies of the Software, and to
32
+ permit persons to whom the Software is furnished to do so, subject to
33
+ the following conditions:
34
+
35
+ The above copyright notice and this permission notice shall be
36
+ included in all copies or substantial portions of the Software.
37
+
38
+
39
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
40
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
41
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
42
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
43
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
44
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
45
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
46
+
47
+ = Credits
48
+
49
+ Durran Jordan: durran at gmail dot com
@@ -0,0 +1,52 @@
1
+ require "rubygems"
2
+ require "rake"
3
+ require "rake/rdoctask"
4
+ require "spec/rake/spectask"
5
+
6
+ begin
7
+ require "jeweler"
8
+ Jeweler::Tasks.new do |gem|
9
+ gem.name = "mongoid-pre"
10
+ gem.summary = "ODM framework for MongoDB - This is a temporary gem to be able to use mongoid with rails 3 in heroku easily"
11
+ gem.email = "papipo@gmail.com"
12
+ gem.homepage = "http://mongoid.org"
13
+ gem.authors = ["Durran Jordan", 'Rodrigo Alvarez']
14
+
15
+ gem.add_dependency("activemodel", ">= 3.0.pre")
16
+ gem.add_dependency("will_paginate", ">= 3.0.pre")
17
+ gem.add_dependency("mongo", ">= 0.19.1")
18
+
19
+ gem.add_development_dependency("rspec", ">= 1.3.0")
20
+ gem.add_development_dependency("mocha", ">= 0.9.8")
21
+ end
22
+ Jeweler::GemcutterTasks.new
23
+ rescue LoadError
24
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
25
+ end
26
+
27
+ Spec::Rake::SpecTask.new(:spec) do |spec|
28
+ spec.pattern = "spec/**/*_spec.rb"
29
+ spec.spec_opts = ["--options", "spec/spec.opts"]
30
+ end
31
+
32
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
33
+ spec.libs << "lib" << "spec"
34
+ spec.pattern = "spec/**/*_spec.rb"
35
+ spec.spec_opts = ["--options", "spec/spec.opts"]
36
+ spec.rcov = true
37
+ end
38
+
39
+ Rake::RDocTask.new do |rdoc|
40
+ if File.exist?("VERSION.yml")
41
+ config = File.read("VERSION")
42
+ version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
43
+ else
44
+ version = ""
45
+ end
46
+ rdoc.rdoc_dir = "rdoc"
47
+ rdoc.title = "mongoid #{version}"
48
+ rdoc.rdoc_files.include("README*")
49
+ rdoc.rdoc_files.include("lib/**/*.rb")
50
+ end
51
+
52
+ task :default => ["spec"]
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 2.0.0.beta1
@@ -0,0 +1,4 @@
1
+ test_directories_to_calculate:
2
+ - spec/unit
3
+ - spec/integration
4
+ - spec/integration/mongoid
@@ -0,0 +1,135 @@
1
+ # encoding: utf-8
2
+ # Copyright (c) 2009 Durran Jordan
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ require "rubygems"
23
+
24
+ gem "activemodel", ">= 3.0.pre"
25
+ gem "will_paginate", ">= 3.0.pre"
26
+ gem "mongo", ">= 0.19.1"
27
+
28
+ require "delegate"
29
+ require "singleton"
30
+ require "time"
31
+ require "active_support/core_ext"
32
+ require 'active_support/json'
33
+ require "active_support/inflector"
34
+ require "active_support/time_with_zone"
35
+ require "active_model"
36
+ require "active_model/callbacks"
37
+ require "active_model/conversion"
38
+ require "active_model/deprecated_error_methods"
39
+ require "active_model/errors"
40
+ require "active_model/naming"
41
+ require "active_model/serialization"
42
+ require "active_model/translation"
43
+ require "active_model/validator"
44
+ require "active_model/validations"
45
+ require "will_paginate/collection"
46
+ require "mongo"
47
+ require "mongoid/associations"
48
+ require "mongoid/attributes"
49
+ require "mongoid/callbacks"
50
+ require "mongoid/collection"
51
+ require "mongoid/commands"
52
+ require "mongoid/config"
53
+ require "mongoid/contexts"
54
+ require "mongoid/criteria"
55
+ require "mongoid/cursor"
56
+ require "mongoid/deprecation"
57
+ require "mongoid/dirty"
58
+ require "mongoid/extensions"
59
+ require "mongoid/extras"
60
+ require "mongoid/errors"
61
+ require "mongoid/factory"
62
+ require "mongoid/field"
63
+ require "mongoid/fields"
64
+ require "mongoid/finders"
65
+ require "mongoid/identity"
66
+ require "mongoid/indexes"
67
+ require "mongoid/javascript"
68
+ require "mongoid/matchers"
69
+ require "mongoid/memoization"
70
+ require "mongoid/named_scope"
71
+ require "mongoid/observable"
72
+ require "mongoid/paths"
73
+ require "mongoid/persistence"
74
+ require "mongoid/scope"
75
+ require "mongoid/state"
76
+ require "mongoid/timestamps"
77
+ require "mongoid/validations"
78
+ require "mongoid/versioning"
79
+ require "mongoid/components"
80
+ require "mongoid/document"
81
+
82
+ module Mongoid #:nodoc
83
+
84
+ class << self
85
+
86
+ # Sets the Mongoid configuration options. Best used by passing a block.
87
+ #
88
+ # Example:
89
+ #
90
+ # Mongoid.configure do |config|
91
+ # name = "mongoid_test"
92
+ # host = "localhost"
93
+ # config.allow_dynamic_fields = false
94
+ # config.master = Mongo::Connection.new.db(name)
95
+ # config.slaves = [
96
+ # Mongo::Connection.new(host, 27018, :slave_ok => true).db(name),
97
+ # Mongo::Connection.new(host, 27019, :slave_ok => true).db(name)
98
+ # ]
99
+ # end
100
+ #
101
+ # Returns:
102
+ #
103
+ # The Mongoid +Config+ singleton instance.
104
+ def configure
105
+ config = Mongoid::Config.instance
106
+ block_given? ? yield(config) : config
107
+ end
108
+
109
+ # Easy convenience method for having an alert generated from the
110
+ # deprecation module.
111
+ #
112
+ # Example:
113
+ #
114
+ # <tt>Mongoid.deprecate("Method no longer used")</tt>
115
+ def deprecate(message)
116
+ Mongoid::Deprecation.instance.alert(message)
117
+ end
118
+
119
+ alias :config :configure
120
+ end
121
+
122
+ # Take all the public instance methods from the Config singleton and allow
123
+ # them to be accessed through the Mongoid module directly.
124
+ #
125
+ # Example:
126
+ #
127
+ # <tt>Mongoid.database = Mongo::Connection.new.db("test")</tt>
128
+ Mongoid::Config.public_instance_methods(false).each do |name|
129
+ (class << self; self; end).class_eval <<-EOT
130
+ def #{name}(*args)
131
+ configure.send("#{name}", *args)
132
+ end
133
+ EOT
134
+ end
135
+ end
@@ -0,0 +1,263 @@
1
+ # encoding: utf-8
2
+ require "mongoid/associations/proxy"
3
+ require "mongoid/associations/belongs_to_related"
4
+ require "mongoid/associations/embedded_in"
5
+ require "mongoid/associations/embeds_many"
6
+ require "mongoid/associations/embeds_one"
7
+ require "mongoid/associations/has_many_related"
8
+ require "mongoid/associations/has_one_related"
9
+ require "mongoid/associations/options"
10
+ require "mongoid/associations/meta_data"
11
+
12
+ module Mongoid # :nodoc:
13
+ module Associations #:nodoc:
14
+ extend ActiveSupport::Concern
15
+ included do
16
+ # Associations need to inherit down the chain.
17
+ class_inheritable_accessor :associations
18
+ self.associations = {}
19
+ end
20
+
21
+ module InstanceMethods
22
+ # Returns the associations for the +Document+.
23
+ def associations
24
+ self.class.associations
25
+ end
26
+
27
+ # Updates all the one-to-many relational associations for the name.
28
+ def update_associations(name)
29
+ send(name).each { |doc| doc.save } if new_record?
30
+ end
31
+
32
+ # Update the one-to-one relational association for the name.
33
+ def update_association(name)
34
+ association = send(name)
35
+ association.save if new_record? && !association.nil?
36
+ end
37
+ end
38
+
39
+ module ClassMethods
40
+
41
+ # Adds the association back to the parent document. This macro is
42
+ # necessary to set the references from the child back to the parent
43
+ # document. If a child does not define this association calling
44
+ # persistence methods on the child object will cause a save to fail.
45
+ #
46
+ # Options:
47
+ #
48
+ # name: A +Symbol+ that matches the name of the parent class.
49
+ #
50
+ # Example:
51
+ #
52
+ # class Person
53
+ # include Mongoid::Document
54
+ # embeds_many :addresses
55
+ # end
56
+ #
57
+ # class Address
58
+ # include Mongoid::Document
59
+ # embedded_in :person, :inverse_of => :addresses
60
+ # end
61
+ def embedded_in(name, options = {}, &block)
62
+ unless options.has_key?(:inverse_of)
63
+ raise Errors::InvalidOptions.new("Options for belongs_to association must include :inverse_of")
64
+ end
65
+ self.embedded = true
66
+ add_association(
67
+ Associations::EmbeddedIn,
68
+ Associations::Options.new(
69
+ options.merge(:name => name, :extend => block)
70
+ )
71
+ )
72
+ end
73
+
74
+ # Adds a relational association from the child Document to a Document in
75
+ # another database or collection.
76
+ #
77
+ # Options:
78
+ #
79
+ # name: A +Symbol+ that is the related class name.
80
+ #
81
+ # Example:
82
+ #
83
+ # class Game
84
+ # include Mongoid::Document
85
+ # belongs_to_related :person
86
+ # end
87
+ #
88
+ def belongs_to_related(name, options = {}, &block)
89
+ opts = Associations::Options.new(
90
+ options.merge(:name => name, :extend => block, :foreign_key => foreign_key(name, options))
91
+ )
92
+ add_association(Associations::BelongsToRelated, opts)
93
+ field(opts.foreign_key, :type => Mongoid.use_object_ids ? Mongo::ObjectID : String)
94
+ index(opts.foreign_key) unless self.embedded
95
+ end
96
+
97
+ # Adds the association from a parent document to its children. The name
98
+ # of the association needs to be a pluralized form of the child class
99
+ # name.
100
+ #
101
+ # Options:
102
+ #
103
+ # name: A +Symbol+ that is the plural child class name.
104
+ #
105
+ # Example:
106
+ #
107
+ # class Person
108
+ # include Mongoid::Document
109
+ # embeds_many :addresses
110
+ # end
111
+ #
112
+ # class Address
113
+ # include Mongoid::Document
114
+ # embedded_in :person, :inverse_of => :addresses
115
+ # end
116
+ def embeds_many(name, options = {}, &block)
117
+ add_association(
118
+ Associations::EmbedsMany,
119
+ Associations::Options.new(
120
+ options.merge(:name => name, :extend => block)
121
+ )
122
+ )
123
+ end
124
+
125
+ alias :embed_many :embeds_many
126
+
127
+ # Adds a relational association from the Document to many Documents in
128
+ # another database or collection.
129
+ #
130
+ # Options:
131
+ #
132
+ # name: A +Symbol+ that is the related class name pluralized.
133
+ #
134
+ # Example:
135
+ #
136
+ # class Person
137
+ # include Mongoid::Document
138
+ # has_many_related :posts
139
+ # end
140
+ #
141
+ def has_many_related(name, options = {}, &block)
142
+ add_association(Associations::HasManyRelated,
143
+ Associations::Options.new(
144
+ options.merge(:name => name, :foreign_key => foreign_key(self.name, options), :extend => block)
145
+ )
146
+ )
147
+ before_save do |document|
148
+ document.update_associations(name)
149
+ end
150
+ end
151
+
152
+ # Adds the association from a parent document to its child. The name
153
+ # of the association needs to be a singular form of the child class
154
+ # name.
155
+ #
156
+ # Options:
157
+ #
158
+ # name: A +Symbol+ that is the plural child class name.
159
+ #
160
+ # Example:
161
+ #
162
+ # class Person
163
+ # include Mongoid::Document
164
+ # embeds_one :name
165
+ # end
166
+ #
167
+ # class Name
168
+ # include Mongoid::Document
169
+ # embedded_in :person
170
+ # end
171
+ def embeds_one(name, options = {}, &block)
172
+ opts = Associations::Options.new(
173
+ options.merge(:name => name, :extend => block)
174
+ )
175
+ type = Associations::EmbedsOne
176
+ add_association(type, opts)
177
+ add_builder(type, opts)
178
+ add_creator(type, opts)
179
+ end
180
+
181
+ alias :embed_one :embeds_one
182
+
183
+ # Adds a relational association from the Document to one Document in
184
+ # another database or collection.
185
+ #
186
+ # Options:
187
+ #
188
+ # name: A +Symbol+ that is the related class name pluralized.
189
+ #
190
+ # Example:
191
+ #
192
+ # class Person
193
+ # include Mongoid::Document
194
+ # has_one_related :game
195
+ # end
196
+ def has_one_related(name, options = {}, &block)
197
+ add_association(
198
+ Associations::HasOneRelated,
199
+ Associations::Options.new(
200
+ options.merge(:name => name, :foreign_key => foreign_key(name, options), :extend => block)
201
+ )
202
+ )
203
+ before_save do |document|
204
+ document.update_association(name)
205
+ end
206
+ end
207
+
208
+ # Returns the macro associated with the supplied association name. This
209
+ # will return has_one, has_many, belongs_to or nil.
210
+ #
211
+ # Options:
212
+ #
213
+ # name: The association name.
214
+ #
215
+ # Example:
216
+ #
217
+ # <tt>Person.reflect_on_association(:addresses)</tt>
218
+ def reflect_on_association(name)
219
+ association = associations[name.to_s]
220
+ association ? association.macro : nil
221
+ end
222
+
223
+ protected
224
+ # Adds the association to the associations hash with the type as the key,
225
+ # then adds the accessors for the association. The defined setters and
226
+ # getters for the associations will perform the necessary memoization.
227
+ def add_association(type, options)
228
+ name = options.name.to_s
229
+ associations[name] = MetaData.new(type, options)
230
+ define_method(name) do
231
+ memoized(name) { type.instantiate(self, options) }
232
+ end
233
+ define_method("#{name}=") do |object|
234
+ reset(name) { type.update(object, self, options) }
235
+ end
236
+ end
237
+
238
+ # Adds a builder for a has_one association. This comes in the form of
239
+ # build_name(attributes)
240
+ def add_builder(type, options)
241
+ name = options.name.to_s
242
+ define_method("build_#{name}") do |attrs|
243
+ reset(name) { type.new(self, (attrs || {}).stringify_keys, options) }
244
+ end
245
+ end
246
+
247
+ # Adds a creator for a has_one association. This comes in the form of
248
+ # create_name(attributes)
249
+ def add_creator(type, options)
250
+ name = options.name.to_s
251
+ define_method("create_#{name}") do |attrs|
252
+ document = send("build_#{name}", attrs)
253
+ document.run_callbacks(:create) { document.save }; document
254
+ end
255
+ end
256
+
257
+ # Find the foreign key.
258
+ def foreign_key(name, options)
259
+ options[:foreign_key] || name.to_s.foreign_key
260
+ end
261
+ end
262
+ end
263
+ end