mongoid 2.0.0.alpha → 2.0.0.beta.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (216) hide show
  1. data/lib/mongoid.rb +11 -5
  2. data/lib/mongoid/associations.rb +112 -107
  3. data/lib/mongoid/associations/belongs_to_related.rb +2 -3
  4. data/lib/mongoid/associations/embedded_in.rb +12 -4
  5. data/lib/mongoid/associations/{embed_many.rb → embeds_many.rb} +101 -32
  6. data/lib/mongoid/associations/{embed_one.rb → embeds_one.rb} +10 -10
  7. data/lib/mongoid/associations/has_many_related.rb +51 -5
  8. data/lib/mongoid/associations/has_one_related.rb +9 -5
  9. data/lib/mongoid/associations/meta_data.rb +2 -1
  10. data/lib/mongoid/associations/options.rb +15 -6
  11. data/lib/mongoid/associations/proxy.rb +14 -21
  12. data/lib/mongoid/attributes.rb +34 -13
  13. data/lib/mongoid/callbacks.rb +1 -2
  14. data/lib/mongoid/collection.rb +4 -3
  15. data/lib/mongoid/collections.rb +41 -0
  16. data/lib/mongoid/collections/master.rb +3 -2
  17. data/lib/mongoid/collections/slaves.rb +3 -2
  18. data/lib/mongoid/components.rb +4 -1
  19. data/lib/mongoid/config.rb +163 -13
  20. data/lib/mongoid/contexts.rb +1 -2
  21. data/lib/mongoid/contexts/enumerable.rb +1 -1
  22. data/lib/mongoid/contexts/mongo.rb +1 -1
  23. data/lib/mongoid/contexts/paging.rb +10 -2
  24. data/lib/mongoid/criteria.rb +13 -22
  25. data/lib/mongoid/criterion/exclusion.rb +3 -3
  26. data/lib/mongoid/criterion/inclusion.rb +17 -0
  27. data/lib/mongoid/criterion/optional.rb +1 -1
  28. data/lib/mongoid/dirty.rb +253 -0
  29. data/lib/mongoid/document.rb +40 -85
  30. data/lib/mongoid/errors.rb +48 -1
  31. data/lib/mongoid/extensions.rb +11 -9
  32. data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
  33. data/lib/mongoid/extensions/boolean/conversions.rb +8 -2
  34. data/lib/mongoid/extensions/date/conversions.rb +13 -4
  35. data/lib/mongoid/extensions/datetime/conversions.rb +1 -6
  36. data/lib/mongoid/extensions/float/conversions.rb +5 -1
  37. data/lib/mongoid/extensions/hash/assimilation.rb +12 -3
  38. data/lib/mongoid/extensions/hash/conversions.rb +34 -4
  39. data/lib/mongoid/extensions/integer/conversions.rb +5 -1
  40. data/lib/mongoid/extensions/nil/assimilation.rb +4 -0
  41. data/lib/mongoid/extensions/object/conversions.rb +3 -3
  42. data/lib/mongoid/extensions/string/conversions.rb +1 -1
  43. data/lib/mongoid/extensions/symbol/inflections.rb +5 -2
  44. data/lib/mongoid/extensions/time_conversions.rb +35 -0
  45. data/lib/mongoid/factory.rb +2 -1
  46. data/lib/mongoid/field.rb +15 -2
  47. data/lib/mongoid/fields.rb +1 -1
  48. data/lib/mongoid/identity.rb +3 -3
  49. data/lib/mongoid/indexes.rb +3 -3
  50. data/lib/mongoid/matchers.rb +1 -2
  51. data/lib/mongoid/memoization.rb +8 -2
  52. data/lib/mongoid/named_scope.rb +0 -5
  53. data/lib/mongoid/observable.rb +1 -1
  54. data/lib/mongoid/paths.rb +30 -22
  55. data/lib/mongoid/persistence.rb +218 -0
  56. data/lib/mongoid/persistence/command.rb +39 -0
  57. data/lib/mongoid/persistence/insert.rb +47 -0
  58. data/lib/mongoid/persistence/insert_embedded.rb +38 -0
  59. data/lib/mongoid/persistence/remove.rb +39 -0
  60. data/lib/mongoid/persistence/remove_all.rb +37 -0
  61. data/lib/mongoid/persistence/remove_embedded.rb +50 -0
  62. data/lib/mongoid/persistence/update.rb +63 -0
  63. data/lib/mongoid/railtie.rb +53 -0
  64. data/lib/mongoid/railties/database.rake +37 -0
  65. data/lib/mongoid/timestamps.rb +2 -2
  66. data/lib/mongoid/validations.rb +2 -2
  67. data/lib/mongoid/validations/associated.rb +2 -2
  68. data/lib/mongoid/validations/uniqueness.rb +13 -2
  69. data/lib/mongoid/version.rb +4 -0
  70. data/lib/mongoid/versioning.rb +3 -2
  71. data/lib/rails/generators/mongoid/config/config_generator.rb +41 -0
  72. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +24 -0
  73. data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
  74. data/lib/rails/generators/mongoid/model/templates/model.rb +15 -0
  75. data/lib/rails/generators/mongoid_generator.rb +61 -0
  76. metadata +76 -301
  77. data/.gitignore +0 -6
  78. data/.watchr +0 -29
  79. data/Rakefile +0 -52
  80. data/VERSION +0 -1
  81. data/caliper.yml +0 -4
  82. data/lib/mongoid/collections/mimic.rb +0 -46
  83. data/lib/mongoid/commands.rb +0 -161
  84. data/lib/mongoid/commands/create.rb +0 -19
  85. data/lib/mongoid/commands/delete.rb +0 -16
  86. data/lib/mongoid/commands/delete_all.rb +0 -23
  87. data/lib/mongoid/commands/deletion.rb +0 -18
  88. data/lib/mongoid/commands/destroy.rb +0 -17
  89. data/lib/mongoid/commands/destroy_all.rb +0 -23
  90. data/lib/mongoid/commands/save.rb +0 -29
  91. data/lib/mongoid/extensions/time/conversions.rb +0 -18
  92. data/mongoid.gemspec +0 -408
  93. data/perf/benchmark.rb +0 -77
  94. data/spec/integration/mongoid/associations_spec.rb +0 -340
  95. data/spec/integration/mongoid/attributes_spec.rb +0 -22
  96. data/spec/integration/mongoid/commands_spec.rb +0 -227
  97. data/spec/integration/mongoid/contexts/enumerable_spec.rb +0 -33
  98. data/spec/integration/mongoid/criteria_spec.rb +0 -272
  99. data/spec/integration/mongoid/document_spec.rb +0 -650
  100. data/spec/integration/mongoid/extensions_spec.rb +0 -22
  101. data/spec/integration/mongoid/finders_spec.rb +0 -119
  102. data/spec/integration/mongoid/inheritance_spec.rb +0 -137
  103. data/spec/integration/mongoid/named_scope_spec.rb +0 -46
  104. data/spec/models/address.rb +0 -39
  105. data/spec/models/animal.rb +0 -6
  106. data/spec/models/callbacks.rb +0 -18
  107. data/spec/models/comment.rb +0 -8
  108. data/spec/models/country_code.rb +0 -6
  109. data/spec/models/employer.rb +0 -5
  110. data/spec/models/game.rb +0 -7
  111. data/spec/models/inheritance.rb +0 -56
  112. data/spec/models/location.rb +0 -5
  113. data/spec/models/mixed_drink.rb +0 -4
  114. data/spec/models/name.rb +0 -13
  115. data/spec/models/namespacing.rb +0 -11
  116. data/spec/models/patient.rb +0 -4
  117. data/spec/models/person.rb +0 -99
  118. data/spec/models/pet.rb +0 -7
  119. data/spec/models/pet_owner.rb +0 -6
  120. data/spec/models/phone.rb +0 -7
  121. data/spec/models/post.rb +0 -15
  122. data/spec/models/translation.rb +0 -5
  123. data/spec/models/vet_visit.rb +0 -5
  124. data/spec/spec.opts +0 -3
  125. data/spec/spec_helper.rb +0 -31
  126. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +0 -145
  127. data/spec/unit/mongoid/associations/embed_many_spec.rb +0 -516
  128. data/spec/unit/mongoid/associations/embed_one_spec.rb +0 -282
  129. data/spec/unit/mongoid/associations/embedded_in_spec.rb +0 -193
  130. data/spec/unit/mongoid/associations/has_many_related_spec.rb +0 -418
  131. data/spec/unit/mongoid/associations/has_one_related_spec.rb +0 -179
  132. data/spec/unit/mongoid/associations/meta_data_spec.rb +0 -88
  133. data/spec/unit/mongoid/associations/options_spec.rb +0 -192
  134. data/spec/unit/mongoid/associations_spec.rb +0 -595
  135. data/spec/unit/mongoid/attributes_spec.rb +0 -507
  136. data/spec/unit/mongoid/callbacks_spec.rb +0 -55
  137. data/spec/unit/mongoid/collection_spec.rb +0 -187
  138. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +0 -75
  139. data/spec/unit/mongoid/collections/master_spec.rb +0 -41
  140. data/spec/unit/mongoid/collections/mimic_spec.rb +0 -43
  141. data/spec/unit/mongoid/collections/slaves_spec.rb +0 -81
  142. data/spec/unit/mongoid/commands/create_spec.rb +0 -31
  143. data/spec/unit/mongoid/commands/delete_all_spec.rb +0 -58
  144. data/spec/unit/mongoid/commands/delete_spec.rb +0 -38
  145. data/spec/unit/mongoid/commands/destroy_all_spec.rb +0 -21
  146. data/spec/unit/mongoid/commands/destroy_spec.rb +0 -51
  147. data/spec/unit/mongoid/commands/save_spec.rb +0 -107
  148. data/spec/unit/mongoid/commands_spec.rb +0 -270
  149. data/spec/unit/mongoid/config_spec.rb +0 -172
  150. data/spec/unit/mongoid/contexts/enumerable_spec.rb +0 -421
  151. data/spec/unit/mongoid/contexts/mongo_spec.rb +0 -682
  152. data/spec/unit/mongoid/contexts_spec.rb +0 -25
  153. data/spec/unit/mongoid/criteria_spec.rb +0 -824
  154. data/spec/unit/mongoid/criterion/complex_spec.rb +0 -19
  155. data/spec/unit/mongoid/criterion/exclusion_spec.rb +0 -91
  156. data/spec/unit/mongoid/criterion/inclusion_spec.rb +0 -219
  157. data/spec/unit/mongoid/criterion/optional_spec.rb +0 -319
  158. data/spec/unit/mongoid/cursor_spec.rb +0 -74
  159. data/spec/unit/mongoid/deprecation_spec.rb +0 -24
  160. data/spec/unit/mongoid/document_spec.rb +0 -818
  161. data/spec/unit/mongoid/errors_spec.rb +0 -103
  162. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +0 -50
  163. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +0 -24
  164. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +0 -35
  165. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +0 -20
  166. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +0 -22
  167. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +0 -22
  168. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +0 -49
  169. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +0 -102
  170. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +0 -67
  171. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +0 -61
  172. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +0 -184
  173. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +0 -46
  174. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +0 -21
  175. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +0 -17
  176. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +0 -14
  177. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +0 -61
  178. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +0 -24
  179. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +0 -57
  180. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +0 -34
  181. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +0 -17
  182. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +0 -208
  183. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +0 -91
  184. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +0 -70
  185. data/spec/unit/mongoid/extras_spec.rb +0 -102
  186. data/spec/unit/mongoid/factory_spec.rb +0 -31
  187. data/spec/unit/mongoid/field_spec.rb +0 -143
  188. data/spec/unit/mongoid/fields_spec.rb +0 -181
  189. data/spec/unit/mongoid/finders_spec.rb +0 -404
  190. data/spec/unit/mongoid/identity_spec.rb +0 -109
  191. data/spec/unit/mongoid/indexes_spec.rb +0 -93
  192. data/spec/unit/mongoid/javascript_spec.rb +0 -48
  193. data/spec/unit/mongoid/matchers/all_spec.rb +0 -27
  194. data/spec/unit/mongoid/matchers/default_spec.rb +0 -27
  195. data/spec/unit/mongoid/matchers/exists_spec.rb +0 -56
  196. data/spec/unit/mongoid/matchers/gt_spec.rb +0 -39
  197. data/spec/unit/mongoid/matchers/gte_spec.rb +0 -49
  198. data/spec/unit/mongoid/matchers/in_spec.rb +0 -27
  199. data/spec/unit/mongoid/matchers/lt_spec.rb +0 -39
  200. data/spec/unit/mongoid/matchers/lte_spec.rb +0 -49
  201. data/spec/unit/mongoid/matchers/ne_spec.rb +0 -27
  202. data/spec/unit/mongoid/matchers/nin_spec.rb +0 -27
  203. data/spec/unit/mongoid/matchers/size_spec.rb +0 -27
  204. data/spec/unit/mongoid/matchers_spec.rb +0 -329
  205. data/spec/unit/mongoid/memoization_spec.rb +0 -75
  206. data/spec/unit/mongoid/named_scope_spec.rb +0 -123
  207. data/spec/unit/mongoid/observable_spec.rb +0 -46
  208. data/spec/unit/mongoid/paths_spec.rb +0 -124
  209. data/spec/unit/mongoid/scope_spec.rb +0 -240
  210. data/spec/unit/mongoid/state_spec.rb +0 -83
  211. data/spec/unit/mongoid/timestamps_spec.rb +0 -25
  212. data/spec/unit/mongoid/validations/associated_spec.rb +0 -103
  213. data/spec/unit/mongoid/validations/uniqueness_spec.rb +0 -47
  214. data/spec/unit/mongoid/validations_spec.rb +0 -190
  215. data/spec/unit/mongoid/versioning_spec.rb +0 -41
  216. data/spec/unit/mongoid_spec.rb +0 -46
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ # Insert is a persistence command responsible for taking a document that
5
+ # has not been saved to the database and saving it. This specific class
6
+ # handles the case when the document is embedded in another.
7
+ #
8
+ # The underlying query resembles the following MongoDB query:
9
+ #
10
+ # collection.insert(
11
+ # { "_id" : 1, "field" : "value" },
12
+ # false
13
+ # );
14
+ class InsertEmbedded < Command
15
+ # Insert the new document in the database. If the document's parent is a
16
+ # new record, we will call save on the parent, otherwise we will $push
17
+ # the document onto the parent.
18
+ #
19
+ # Example:
20
+ #
21
+ # <tt>Insert.persist</tt>
22
+ #
23
+ # Returns:
24
+ #
25
+ # The +Document+, whether the insert succeeded or not.
26
+ def persist
27
+ parent = @document._parent
28
+ if parent.new_record?
29
+ parent.insert
30
+ else
31
+ update = { @document._inserter => { @document._position => @document.raw_attributes } }
32
+ @collection.update(parent._selector, update, @options.merge(:multi => false))
33
+ end
34
+ @document.new_record = false; @document
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,39 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ # Remove is a persistence command responsible for deleting a document from
5
+ # the database.
6
+ #
7
+ # The underlying query resembles the following MongoDB query:
8
+ #
9
+ # collection.remove(
10
+ # { "_id" : 1 },
11
+ # false
12
+ # );
13
+ class Remove < Command
14
+ # Remove the document from the database: delegates to the MongoDB
15
+ # collection remove method.
16
+ #
17
+ # Example:
18
+ #
19
+ # <tt>Remove.persist</tt>
20
+ #
21
+ # Returns:
22
+ #
23
+ # +true+ if success, +false+ if not.
24
+ def persist
25
+ remove
26
+ end
27
+
28
+ protected
29
+ # Remove the document from the database.
30
+ def remove
31
+ if @document.embedded?
32
+ Persistence::RemoveEmbedded.new(@document, @validate).persist
33
+ else
34
+ @collection.remove({ :_id => @document.id }, @options)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ # Remove is a persistence command responsible for deleting a document from
5
+ # the database.
6
+ #
7
+ # The underlying query resembles the following MongoDB query:
8
+ #
9
+ # collection.remove(
10
+ # { "field" : value },
11
+ # false
12
+ # );
13
+ class RemoveAll < Command
14
+ # Remove the document from the database: delegates to the MongoDB
15
+ # collection remove method.
16
+ #
17
+ # Example:
18
+ #
19
+ # <tt>Remove.persist</tt>
20
+ #
21
+ # Returns:
22
+ #
23
+ # +true+ if success, +false+ if not.
24
+ def persist
25
+ remove
26
+ end
27
+
28
+ protected
29
+ # Remove the document from the database.
30
+ def remove
31
+ count = @collection.find(@selector.merge(:_type => @klass.name)).count
32
+ @collection.remove(@selector, @options)
33
+ count
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ # Remove is a persistence command responsible for deleting a document from
5
+ # the database.
6
+ #
7
+ # The underlying query resembles the following MongoDB query:
8
+ #
9
+ # collection.remove(
10
+ # { "_id" : 1 },
11
+ # false
12
+ # );
13
+ class RemoveEmbedded < Command
14
+ # Insert the new document in the database. If the document's parent is a
15
+ # new record, we will call save on the parent, otherwise we will $push
16
+ # the document onto the parent.
17
+ #
18
+ # Remove the document from the database. If the parent is a new record,
19
+ # it will get removed in Ruby only. If the parent is not a new record
20
+ # then either an $unset or $set will occur, depending if it's an
21
+ # embeds_one or embeds_many.
22
+ #
23
+ # Example:
24
+ #
25
+ # <tt>RemoveEmbedded.persist</tt>
26
+ #
27
+ # Returns:
28
+ #
29
+ # +true+ or +false+, depending on if the removal passed.
30
+ def persist
31
+ parent = @document._parent
32
+ parent.remove(@document)
33
+ unless parent.new_record?
34
+ update = { @document._remover => removal_selector }
35
+ @collection.update(parent._selector, update, @options.merge(:multi => false))
36
+ end; true
37
+ end
38
+
39
+ protected
40
+ # Get the value to pass to the removal modifier.
41
+ def setter
42
+ @document._index ? @document.id : true
43
+ end
44
+
45
+ def removal_selector
46
+ @document._index ? { @document._pull => { "_id" => @document.id } } : { @document._path => setter }
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,63 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ # Update is a persistence command responsible for taking a document that
5
+ # has already been saved to the database and saving it, depending on
6
+ # whether or not the document has been modified.
7
+ #
8
+ # Before persisting the command will check via dirty attributes if the
9
+ # document has changed, if not, it will simply return true. If it has it
10
+ # will go through the validation steps, run callbacks, and set the changed
11
+ # fields atomically on the document. The underlying query resembles the
12
+ # following MongoDB query:
13
+ #
14
+ # collection.update(
15
+ # { "_id" : 1,
16
+ # { "$set" : { "field" : "value" },
17
+ # false,
18
+ # false
19
+ # );
20
+ #
21
+ # For embedded documents it will use the positional locator:
22
+ #
23
+ # collection.update(
24
+ # { "_id" : 1, "addresses._id" : 2 },
25
+ # { "$set" : { "addresses.$.field" : "value" },
26
+ # false,
27
+ # false
28
+ # );
29
+ #
30
+ class Update < Command
31
+ # Persist the document that is to be updated to the database. This will
32
+ # only write changed fields via MongoDB's $set modifier operation.
33
+ #
34
+ # Example:
35
+ #
36
+ # <tt>Update.persist</tt>
37
+ #
38
+ # Returns:
39
+ #
40
+ # +true+ or +false+, depending on validation.
41
+ def persist
42
+ return false if validate && !@document.valid?
43
+ @document.run_callbacks(:save) do
44
+ @document.run_callbacks(:update) do
45
+ if update
46
+ @document.move_changes
47
+ else
48
+ return false
49
+ end
50
+ end
51
+ end; true
52
+ end
53
+
54
+ protected
55
+ # Update the document in the database atomically.
56
+ def update
57
+ if @document.changed?
58
+ @collection.update(@document._selector, { "$set" => @document.setters }, @options.merge(:multi => false))
59
+ end; true
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,53 @@
1
+ module Rails #:nodoc:
2
+ module Mongoid #:nodoc:
3
+ class Railtie < Rails::Railtie #:nodoc:
4
+
5
+ # do we want a custom log subscriber for mongoid?
6
+ # log_subscriber :mongoid, ::Mongoid::Railties::LogSubscriber.new
7
+
8
+ rake_tasks do
9
+ load "mongoid/railties/database.rake"
10
+ end
11
+
12
+ # Initialize Mongoid. This will look for a mongoid.yml in the config
13
+ # directory and configure mongoid appropriately.
14
+ #
15
+ # Example mongoid.yml:
16
+ #
17
+ # defaults: &defaults
18
+ # host: localhost
19
+ # slaves:
20
+ # # - host: localhost
21
+ # # port: 27018
22
+ # # - host: localhost
23
+ # # port: 27019
24
+ # allow_dynamic_fields: false
25
+ # parameterize_keys: false
26
+ # persist_in_safe_mode: false
27
+ #
28
+ # development:
29
+ # <<: *defaults
30
+ # database: mongoid
31
+ initializer "setup database" do
32
+ config_file = Rails.root.join("config", "mongoid.yml")
33
+ if config_file.file?
34
+ settings = YAML.load(ERB.new(config_file.read).result)[Rails.env]
35
+ ::Mongoid.from_hash(settings) if settings.present?
36
+ end
37
+ end
38
+
39
+ initializer "verify that mongoid is configured" do
40
+ config.after_initialize do
41
+ begin
42
+ ::Mongoid.master
43
+ rescue ::Mongoid::Errors::InvalidDatabase => e
44
+ unless Rails.root.join("config", "mongoid.yml").file?
45
+ puts "\nMongoid config not found. Create a config file at: config/mongoid.yml"
46
+ puts "to generate one run: script/rails generate mongoid:config\n\n"
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,37 @@
1
+ namespace :db do
2
+
3
+ desc 'Drops all the collections for the database for the current Rails.env'
4
+ task :drop => :environment do
5
+ Mongoid.master.collections.each{|col| col.drop unless col.name == 'system.users' }
6
+ end
7
+
8
+ desc 'Load the seed data from db/seeds.rb'
9
+ task :seed => :environment do
10
+ seed_file = File.join(Rails.root, 'db', 'seeds.rb')
11
+ load(seed_file) if File.exist?(seed_file)
12
+ end
13
+
14
+ desc 'Create the database, and initialize with the seed data'
15
+ task :setup => [ 'db:create', 'db:seed' ]
16
+
17
+ desc 'Delete data and seed'
18
+ task :reseed => [ 'db:drop', 'db:seed' ]
19
+
20
+ task :create => :environment do
21
+ # noop
22
+ end
23
+
24
+ task :migrate => :environment do
25
+ # noop
26
+ end
27
+
28
+ namespace :schema do
29
+ task :load do
30
+ # noop
31
+ end
32
+ end
33
+
34
+ ########
35
+ # TODO: lots more useful db tasks can be added here. stuff like copyDatabase, etc
36
+ ########
37
+ end
@@ -5,7 +5,8 @@ module Mongoid #:nodoc:
5
5
  included do
6
6
  field :created_at, :type => Time
7
7
  field :updated_at, :type => Time
8
- before_save :set_created_at, :set_updated_at
8
+ set_callback :create, :before, :set_created_at
9
+ set_callback :save, :before, :set_updated_at
9
10
  end
10
11
 
11
12
  module InstanceMethods
@@ -22,6 +23,5 @@ module Mongoid #:nodoc:
22
23
  self.updated_at = Time.now.utc
23
24
  end
24
25
  end
25
-
26
26
  end
27
27
  end
@@ -23,8 +23,8 @@ module Mongoid #:nodoc:
23
23
  #
24
24
  # class Person
25
25
  # include Mongoid::Document
26
- # embed_one :name
27
- # embed_many :addresses
26
+ # embeds_one :name
27
+ # embeds_many :addresses
28
28
  #
29
29
  # validates_associated :name, :addresses
30
30
  # end
@@ -8,8 +8,8 @@ module Mongoid #:nodoc:
8
8
  #
9
9
  # class Person
10
10
  # include Mongoid::Document
11
- # embed_one :name
12
- # embed_many :addresses
11
+ # embeds_one :name
12
+ # embeds_many :addresses
13
13
  #
14
14
  # validates_associated :name, :addresses
15
15
  # end
@@ -14,8 +14,19 @@ module Mongoid #:nodoc:
14
14
  # end
15
15
  class UniquenessValidator < ActiveModel::EachValidator
16
16
  def validate_each(document, attribute, value)
17
- return if document.class.where(attribute => value, :_id.ne => document._id).empty?
18
- document.errors.add(attribute, :taken, :default => options[:message], :value => value)
17
+ conditions = {attribute => value}
18
+ conditions[options[:scope]] = document.attributes[options[:scope]] if options.has_key? :scope
19
+ return if document.class.where(conditions).empty?
20
+ if document.new_record? || key_changed?(document)
21
+ document.errors.add(attribute, :taken, :default => options[:message], :value => value)
22
+ end
23
+ end
24
+
25
+ protected
26
+ def key_changed?(document)
27
+ (document.primary_key || {}).each do |key|
28
+ return true if document.send("#{key}_changed?")
29
+ end; false
19
30
  end
20
31
  end
21
32
  end
@@ -0,0 +1,4 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc
3
+ VERSION = "2.0.0.beta.5"
4
+ end
@@ -7,8 +7,8 @@ module Mongoid #:nodoc:
7
7
  extend ActiveSupport::Concern
8
8
  included do
9
9
  field :version, :type => Integer, :default => 1
10
- embed_many :versions, :class_name => self.name
11
- before_save :revise
10
+ embeds_many :versions, :class_name => self.name
11
+ set_callback :save, :before, :revise
12
12
  end
13
13
  module InstanceMethods
14
14
  # Create a new version of the +Document+. This will load the previous
@@ -19,6 +19,7 @@ module Mongoid #:nodoc:
19
19
  if last_version
20
20
  self.versions << last_version.clone
21
21
  self.version = version + 1
22
+ @modifications["versions"] = [ nil, @attributes["versions"] ] if @modifications
22
23
  end
23
24
  end
24
25
  end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+ require 'rails/generators/mongoid_generator'
3
+
4
+ module Mongoid
5
+ module Generators
6
+ class ConfigGenerator < Rails::Generators::Base
7
+ desc "Creates a Mongoid configuration file at config/mongoid.yml"
8
+
9
+ argument :database_name, :type => :string, :optional => true
10
+
11
+ def self.source_root
12
+ @_mongoid_source_root ||= File.expand_path("../templates", __FILE__)
13
+ end
14
+
15
+ def app_name
16
+ Rails::Application.subclasses.first.parent.to_s.underscore
17
+ end
18
+
19
+ def create_config_file
20
+ template 'mongoid.yml', File.join('config', "mongoid.yml")
21
+ end
22
+
23
+ def inject_mongoid_into_application
24
+ config_application_path = File.join("config", "application.rb")
25
+ config_contents = File.read(config_application_path)
26
+
27
+ mongoid_require = "\n\nrequire 'mongoid/railtie'"
28
+
29
+ # check to see if its already been included
30
+ return if config_contents.include?(mongoid_require)
31
+
32
+ if config_contents.include?("require 'rails/all'")
33
+ inject_into_file config_application_path, mongoid_require, :after => "require 'rails/all'"
34
+ elsif config_contents.include?("require \"action_controller/railtie\"")
35
+ inject_into_file config_application_path, mongoid_require, :after => "require \"action_controller/railtie\""
36
+ end
37
+ end
38
+
39
+ end
40
+ end
41
+ end