mongoid 0.9.9 → 0.9.10

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -12,14 +12,14 @@ begin
12
12
  gem.homepage = "http://github.com/durran/mongoid"
13
13
  gem.authors = ["Durran Jordan"]
14
14
 
15
- gem.add_dependency("durran-validatable", "1.8.3")
16
- gem.add_dependency("leshill-will_paginate", "2.3.11")
17
- gem.add_dependency("activesupport", "2.3.4")
18
- gem.add_dependency("mongo", "0.18.1")
19
- gem.add_dependency("mongo_ext", "0.18.1")
15
+ gem.add_dependency("durran-validatable", ">= 1.8.3")
16
+ gem.add_dependency("leshill-will_paginate", ">= 2.3.11")
17
+ gem.add_dependency("activesupport", ">= 2.3.4")
18
+ gem.add_dependency("mongo", ">= 0.18.1")
19
+ gem.add_dependency("mongo_ext", ">= 0.18.1")
20
20
 
21
- gem.add_development_dependency("rspec", "1.2.9")
22
- gem.add_development_dependency("mocha", "0.9.8")
21
+ gem.add_development_dependency("rspec", ">= 1.2.9")
22
+ gem.add_development_dependency("mocha", ">= 0.9.8")
23
23
  end
24
24
  Jeweler::GemcutterTasks.new
25
25
  rescue LoadError
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.9
1
+ 0.9.10
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ require "mongoid/associations/proxy"
2
3
  require "mongoid/associations/belongs_to"
3
4
  require "mongoid/associations/belongs_to_related"
4
5
  require "mongoid/associations/has_many"
@@ -2,8 +2,8 @@
2
2
  module Mongoid #:nodoc:
3
3
  module Associations #:nodoc:
4
4
  class BelongsTo #:nodoc:
5
+ include Proxy
5
6
 
6
- delegate :==, :to => :document
7
7
  attr_reader :document, :options
8
8
 
9
9
  # Creates the new association by setting the internal
@@ -29,8 +29,8 @@ module Mongoid #:nodoc:
29
29
  end
30
30
 
31
31
  # Delegate all missing methods over to the parent +Document+.
32
- def method_missing(name, *args)
33
- @document.send(name, *args)
32
+ def method_missing(name, *args, &block)
33
+ @document.send(name, *args, &block)
34
34
  end
35
35
 
36
36
  class << self
@@ -1,7 +1,8 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc:
3
3
  module Associations #:nodoc:
4
- class HasMany < DelegateClass(Array) #:nodoc:
4
+ class HasMany
5
+ include Proxy
5
6
 
6
7
  attr_accessor :association_name, :klass
7
8
 
@@ -20,7 +21,7 @@ module Mongoid #:nodoc:
20
21
  object = @documents.first
21
22
  object.changed(true)
22
23
  object.notify_observers(object, true)
23
- super
24
+ @documents.clear
24
25
  end
25
26
 
26
27
  # Appends the object to the +Array+, setting its parent in
@@ -75,7 +76,11 @@ module Mongoid #:nodoc:
75
76
  child.parentize(@parent, @association_name)
76
77
  child
77
78
  end : []
78
- super(@documents)
79
+ end
80
+
81
+ # Delegate all missing methods over to the documents array.
82
+ def method_missing(name, *args, &block)
83
+ @documents.send(name, *args, &block)
79
84
  end
80
85
 
81
86
  # Used for setting associations via a nested attributes setter from the
@@ -2,8 +2,8 @@
2
2
  module Mongoid #:nodoc:
3
3
  module Associations #:nodoc:
4
4
  class HasOne #:nodoc:
5
+ include Proxy
5
6
 
6
- delegate :==, :to => :document
7
7
  attr_reader :association_name, :document, :parent, :options
8
8
 
9
9
  # Build a new object for the association.
@@ -19,8 +19,8 @@ module Mongoid #:nodoc:
19
19
  self
20
20
  end
21
21
 
22
- # Creates the new association by finding the attributes in
23
- # the parent document with its name, and instantiating a
22
+ # Creates the new association by finding the attributes in
23
+ # the parent document with its name, and instantiating a
24
24
  # new document for it.
25
25
  #
26
26
  # All method calls on this object will then be delegated
@@ -39,8 +39,9 @@ module Mongoid #:nodoc:
39
39
  end
40
40
 
41
41
  # Delegate all missing methods over to the +Document+.
42
- def method_missing(name, *args)
43
- @document.send(name, *args)
42
+ def method_missing(name, *args, &block)
43
+ @document = {}.assimilate(@parent, @options) if @document.nil?
44
+ @document.send(name, *args, &block)
44
45
  end
45
46
 
46
47
  # Used for setting the association via a nested attributes setter on the
@@ -0,0 +1,13 @@
1
+ module Mongoid #:nodoc
2
+ module Associations #:nodoc
3
+ module Proxy #:nodoc
4
+ def self.included(base)
5
+ base.class_eval do
6
+ instance_methods.each do |method|
7
+ undef_method(method) unless method =~ /(^__|^nil\?$|^send$|^object_id$)/
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -151,16 +151,6 @@ module Mongoid #:nodoc:
151
151
  @options = extras; filter_options; self
152
152
  end
153
153
 
154
- # Return the first result for the +Criteria+.
155
- #
156
- # Example:
157
- #
158
- # <tt>Criteria.select(:name).where(:name = "Chrissy").one</tt>
159
- def one
160
- attributes = @klass.collection.find_one(@selector, @options.dup)
161
- attributes ? @klass.instantiate(attributes) : nil
162
- end
163
-
164
154
  GROUP_REDUCE = "function(obj, prev) { prev.group.push(obj); }"
165
155
  # Groups the criteria. This will take the internally built selector and options
166
156
  # and pass them on to the Ruby driver's +group()+ method on the collection. The
@@ -341,6 +331,16 @@ module Mongoid #:nodoc:
341
331
  @options[:skip]
342
332
  end
343
333
 
334
+ # Return the first result for the +Criteria+.
335
+ #
336
+ # Example:
337
+ #
338
+ # <tt>Criteria.select(:name).where(:name = "Chrissy").one</tt>
339
+ def one
340
+ attributes = @klass.collection.find_one(@selector, @options.dup)
341
+ attributes ? @klass.instantiate(attributes) : nil
342
+ end
343
+
344
344
  # Adds a criterion to the +Criteria+ that specifies the sort order of
345
345
  # the returned documents in the database. Similar to a SQL "ORDER BY".
346
346
  #
@@ -438,7 +438,10 @@ module Mongoid #:nodoc:
438
438
  def self.translate(*args)
439
439
  klass = args[0]
440
440
  params = args[1] || {}
441
- return new(klass).id(params).one if params.is_a?(String)
441
+ if params.is_a?(String)
442
+ document = new(klass).id(params).one
443
+ return document ? document : (raise Errors::DocumentNotFound.new(klass, params))
444
+ end
442
445
  return new(klass).where(params.delete(:conditions) || {}).extras(params)
443
446
  end
444
447
 
@@ -100,11 +100,12 @@ module Mongoid #:nodoc:
100
100
 
101
101
  # Define a field attribute for the +Document+.
102
102
  def define(name, options = {})
103
+ meth = options.delete(:as) || name
103
104
  @fields ||= {}.with_indifferent_access
104
105
  @fields[name] = Field.new(name.to_s, options)
105
- define_method(name) { read_attribute(name) }
106
- define_method("#{name}=") { |value| write_attribute(name, value) }
107
- define_method("#{name}?") { read_attribute(name) == true } if options[:type] == Boolean
106
+ define_method(meth) { read_attribute(name) }
107
+ define_method("#{meth}=") { |value| write_attribute(name, value) }
108
+ define_method("#{meth}?") { read_attribute(name) == true } if options[:type] == Boolean
108
109
  end
109
110
 
110
111
  # Set up a default value for a field.
@@ -180,7 +181,8 @@ module Mongoid #:nodoc:
180
181
  @attributes = {}.with_indifferent_access
181
182
  process(defaults.merge(attrs))
182
183
  @new_record = true if id.nil?
183
- generate_key
184
+ document = yield self if block_given?
185
+ generate_key; document
184
186
  end
185
187
 
186
188
  # Returns the class name plus its attributes.
@@ -1,6 +1,17 @@
1
1
  module Mongoid #:nodoc
2
2
  module Errors #:nodoc
3
3
 
4
+ # Raised when querying the database for a document by a specific id which
5
+ # does not exist.
6
+ class DocumentNotFound < RuntimeError
7
+ def initialize(klass, identifier)
8
+ @klass, @identifier = klass, identifier
9
+ end
10
+ def message
11
+ "Document not found for class #{@klass} and id #{@identifier}"
12
+ end
13
+ end
14
+
4
15
  # Raised when invalid options are passed into a constructor.
5
16
  class InvalidOptions < RuntimeError; end
6
17
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mongoid}
8
- s.version = "0.9.9"
8
+ s.version = "0.9.10"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Durran Jordan"]
12
- s.date = %q{2009-12-13}
12
+ s.date = %q{2009-12-19}
13
13
  s.email = %q{durran@gmail.com}
14
14
  s.extra_rdoc_files = [
15
15
  "README.textile"
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
30
30
  "lib/mongoid/associations/has_one.rb",
31
31
  "lib/mongoid/associations/has_one_related.rb",
32
32
  "lib/mongoid/associations/options.rb",
33
+ "lib/mongoid/associations/proxy.rb",
33
34
  "lib/mongoid/attributes.rb",
34
35
  "lib/mongoid/commands.rb",
35
36
  "lib/mongoid/commands/create.rb",
@@ -70,6 +71,7 @@ Gem::Specification.new do |s|
70
71
  "perf/benchmark.rb",
71
72
  "spec/integration/mongoid/associations_spec.rb",
72
73
  "spec/integration/mongoid/document_spec.rb",
74
+ "spec/integration/mongoid/finders_spec.rb",
73
75
  "spec/spec.opts",
74
76
  "spec/spec_helper.rb",
75
77
  "spec/unit/mongoid/associations/belongs_to_related_spec.rb",
@@ -124,6 +126,7 @@ Gem::Specification.new do |s|
124
126
  s.test_files = [
125
127
  "spec/integration/mongoid/associations_spec.rb",
126
128
  "spec/integration/mongoid/document_spec.rb",
129
+ "spec/integration/mongoid/finders_spec.rb",
127
130
  "spec/spec_helper.rb",
128
131
  "spec/unit/mongoid/associations/belongs_to_related_spec.rb",
129
132
  "spec/unit/mongoid/associations/belongs_to_spec.rb",
@@ -175,30 +178,30 @@ Gem::Specification.new do |s|
175
178
  s.specification_version = 3
176
179
 
177
180
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
178
- s.add_runtime_dependency(%q<durran-validatable>, ["= 1.8.3"])
179
- s.add_runtime_dependency(%q<leshill-will_paginate>, ["= 2.3.11"])
180
- s.add_runtime_dependency(%q<activesupport>, ["= 2.3.4"])
181
- s.add_runtime_dependency(%q<mongo>, ["= 0.18.1"])
182
- s.add_runtime_dependency(%q<mongo_ext>, ["= 0.18.1"])
183
- s.add_development_dependency(%q<rspec>, ["= 1.2.9"])
184
- s.add_development_dependency(%q<mocha>, ["= 0.9.8"])
181
+ s.add_runtime_dependency(%q<durran-validatable>, [">= 1.8.3"])
182
+ s.add_runtime_dependency(%q<leshill-will_paginate>, [">= 2.3.11"])
183
+ s.add_runtime_dependency(%q<activesupport>, [">= 2.3.4"])
184
+ s.add_runtime_dependency(%q<mongo>, [">= 0.18.1"])
185
+ s.add_runtime_dependency(%q<mongo_ext>, [">= 0.18.1"])
186
+ s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
187
+ s.add_development_dependency(%q<mocha>, [">= 0.9.8"])
185
188
  else
186
- s.add_dependency(%q<durran-validatable>, ["= 1.8.3"])
187
- s.add_dependency(%q<leshill-will_paginate>, ["= 2.3.11"])
188
- s.add_dependency(%q<activesupport>, ["= 2.3.4"])
189
- s.add_dependency(%q<mongo>, ["= 0.18.1"])
190
- s.add_dependency(%q<mongo_ext>, ["= 0.18.1"])
191
- s.add_dependency(%q<rspec>, ["= 1.2.9"])
192
- s.add_dependency(%q<mocha>, ["= 0.9.8"])
189
+ s.add_dependency(%q<durran-validatable>, [">= 1.8.3"])
190
+ s.add_dependency(%q<leshill-will_paginate>, [">= 2.3.11"])
191
+ s.add_dependency(%q<activesupport>, [">= 2.3.4"])
192
+ s.add_dependency(%q<mongo>, [">= 0.18.1"])
193
+ s.add_dependency(%q<mongo_ext>, [">= 0.18.1"])
194
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
195
+ s.add_dependency(%q<mocha>, [">= 0.9.8"])
193
196
  end
194
197
  else
195
- s.add_dependency(%q<durran-validatable>, ["= 1.8.3"])
196
- s.add_dependency(%q<leshill-will_paginate>, ["= 2.3.11"])
197
- s.add_dependency(%q<activesupport>, ["= 2.3.4"])
198
- s.add_dependency(%q<mongo>, ["= 0.18.1"])
199
- s.add_dependency(%q<mongo_ext>, ["= 0.18.1"])
200
- s.add_dependency(%q<rspec>, ["= 1.2.9"])
201
- s.add_dependency(%q<mocha>, ["= 0.9.8"])
198
+ s.add_dependency(%q<durran-validatable>, [">= 1.8.3"])
199
+ s.add_dependency(%q<leshill-will_paginate>, [">= 2.3.11"])
200
+ s.add_dependency(%q<activesupport>, [">= 2.3.4"])
201
+ s.add_dependency(%q<mongo>, [">= 0.18.1"])
202
+ s.add_dependency(%q<mongo_ext>, [">= 0.18.1"])
203
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
204
+ s.add_dependency(%q<mocha>, [">= 0.9.8"])
202
205
  end
203
206
  end
204
207
 
@@ -16,7 +16,7 @@ class Name < Mongoid::Document
16
16
  field :given
17
17
  field :family
18
18
  field :middle
19
- belongs_to :person
19
+ belongs_to :person, :inverse_of => :name
20
20
  end
21
21
 
22
22
  class Address < Mongoid::Document
@@ -26,7 +26,7 @@ class Address < Mongoid::Document
26
26
  field :state
27
27
  field :post_code
28
28
  field :type
29
- belongs_to :person
29
+ belongs_to :person, :inverse_of => :addresses
30
30
  end
31
31
 
32
32
  class Phone < Mongoid::Document
@@ -34,15 +34,18 @@ class Phone < Mongoid::Document
34
34
  field :country_code, :type => Integer
35
35
  field :number
36
36
  field :type
37
- belongs_to :person
37
+ belongs_to :person, :inverse_of => :phones
38
38
  end
39
39
 
40
- Mongoid.connect_to("mongoid_performance")
40
+ connection = Mongo::Connection.new
41
+ Mongoid.database = connection.db("mongoid_perf_test")
41
42
 
42
43
  Mongoid.database.collection("people").drop
43
44
 
44
45
  RubyProf.start
45
46
 
47
+ puts "Starting benchmark..."
48
+
46
49
  1000.times do |n|
47
50
  person = Person.new(:birth_date => Date.new(1970, 1, 1))
48
51
  name = Name.new(:given => "James", :family => "Kirk", :middle => "Tiberius")
@@ -58,9 +61,10 @@ RubyProf.start
58
61
  person.addresses << address
59
62
  person.phones << phone
60
63
  person.save
61
- puts "Saved person #{n}"
62
64
  end
63
65
 
64
66
  result = RubyProf.stop
65
67
  printer = RubyProf::FlatPrinter.new(result)
66
68
  printer.print(STDOUT, 0)
69
+
70
+ Mongoid.database.collection("people").drop
@@ -3,7 +3,9 @@ require "spec_helper"
3
3
  describe Mongoid::Associations do
4
4
 
5
5
  before do
6
- Person.delete_all; Game.delete_all; Post.delete_all
6
+ Mongoid.database.collection(:people).drop
7
+ Mongoid.database.collection(:games).drop
8
+ Mongoid.database.collection(:posts).drop
7
9
  end
8
10
 
9
11
  context "one-to-one relational associations" do
@@ -27,7 +29,7 @@ describe Mongoid::Associations do
27
29
 
28
30
  end
29
31
 
30
- context "one-to_many relational associations" do
32
+ context "one-to-many relational associations" do
31
33
 
32
34
  before do
33
35
  @person = Person.new(:title => "Sir")
@@ -43,4 +45,41 @@ describe Mongoid::Associations do
43
45
 
44
46
  end
45
47
 
48
+ context "nested embedded associations" do
49
+
50
+ before do
51
+ @person = Person.create(:title => "Mr")
52
+ end
53
+
54
+ context "one level nested" do
55
+
56
+ before do
57
+ @address = @person.addresses.create(:street => "Oxford St")
58
+ @name = @person.name.create(:first_name => "Gordon")
59
+ end
60
+
61
+ it "persists all the associations properly" do
62
+ @name.last_name = "Brown"
63
+ @person.name.last_name.should == "Brown"
64
+ end
65
+
66
+ end
67
+
68
+ context "multiple levels nested" do
69
+
70
+ before do
71
+ @person.phone_numbers.create(:number => "4155551212")
72
+ end
73
+
74
+ it "persists all the associations properly" do
75
+ from_db = Person.find(@person.id)
76
+ phone = from_db.phone_numbers.first
77
+ phone.country_code.create(:code => 1)
78
+ from_db.phone_numbers.first.country_code.code.should == 1
79
+ end
80
+
81
+ end
82
+
83
+ end
84
+
46
85
  end
@@ -246,42 +246,6 @@ describe Mongoid::Document do
246
246
 
247
247
  end
248
248
 
249
- context "associating relational data" do
250
-
251
- context "when relational data is a single object" do
252
-
253
- before do
254
- @game = Game.create(:score => 100)
255
- @person = Person.new(:title => "Sir")
256
- @person.game = @game
257
- @person.save
258
- end
259
-
260
- it "properly associates the object" do
261
- person = Person.find(@person.id)
262
- person.game.should == @game
263
- end
264
-
265
- end
266
-
267
- context "when relational data is many objects" do
268
-
269
- before do
270
- @post = Post.new(:title => "New Post")
271
- @person = Person.new(:title => "Sir")
272
- @person.posts = [@post]
273
- @person.save
274
- end
275
-
276
- it "properly associates the objects" do
277
- person = Person.find(@person.id)
278
- person.posts.should == [@post]
279
- end
280
-
281
- end
282
-
283
- end
284
-
285
249
  context "the lot" do
286
250
 
287
251
  before do
@@ -0,0 +1,37 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Finders do
4
+
5
+ describe "#find" do
6
+
7
+ before do
8
+ @document = Person.create(:title => "Mrs.")
9
+ end
10
+
11
+ after do
12
+ Person.delete_all
13
+ end
14
+
15
+ context "with an id as an argument" do
16
+
17
+ context "when the document is found" do
18
+
19
+ it "returns the document" do
20
+ Person.find(@document.id).should == @document
21
+ end
22
+
23
+ end
24
+
25
+ context "when the document is not found" do
26
+
27
+ it "raises an error" do
28
+ lambda { Person.find("5") }.should raise_error
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -2,7 +2,7 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
3
  require 'rubygems'
4
4
 
5
- gem "mocha", "0.9.8"
5
+ gem "mocha", ">= 0.9.8"
6
6
 
7
7
  require "mocha"
8
8
  require "mongoid"
@@ -48,8 +48,8 @@ class Person < Mongoid::Document
48
48
  has_many_related :posts
49
49
 
50
50
  def update_addresses
51
- addresses.each_with_index do |address, i|
52
- address.street = "Updated #{i}"
51
+ addresses.each do |address|
52
+ address.street = "Updated Address"
53
53
  end
54
54
  end
55
55
 
@@ -78,6 +78,34 @@ describe Mongoid::Associations::HasOne do
78
78
 
79
79
  end
80
80
 
81
+ context "when the document is nil" do
82
+
83
+ before do
84
+ @association = Mongoid::Associations::HasOne.new(
85
+ @document,
86
+ {},
87
+ Mongoid::Associations::Options.new(:name => :mixed_drink)
88
+ )
89
+ end
90
+
91
+ describe "#new_record?" do
92
+
93
+ it "returns true" do
94
+ @association.should be_new_record
95
+ end
96
+
97
+ end
98
+
99
+ context "attribute getters" do
100
+
101
+ it "returns nil" do
102
+ @association.name.should be_nil
103
+ end
104
+
105
+ end
106
+
107
+ end
108
+
81
109
  end
82
110
 
83
111
  describe "#nested_build" do
@@ -183,7 +183,7 @@ describe Mongoid::Associations do
183
183
  end
184
184
 
185
185
  it "retains its references to the original objects" do
186
- @address.street.should == "Updated 0"
186
+ @address.street.should == "Updated Address"
187
187
  end
188
188
 
189
189
  end
@@ -194,8 +194,7 @@ describe Mongoid::Associations do
194
194
 
195
195
  it "adds a new Association to the document" do
196
196
  person = Person.new
197
- person.name.should_not be_nil
198
- person.attributes[:name].should be_nil
197
+ person.name.first_name.should be_nil
199
198
  end
200
199
 
201
200
  it "creates a reader for the association" do
@@ -797,13 +797,22 @@ describe Mongoid::Criteria do
797
797
  @criteria = mock
798
798
  Mongoid::Criteria.expects(:new).returns(@criteria)
799
799
  @criteria.expects(:id).with(@id).returns(@criteria)
800
- @criteria.expects(:one).returns(@document)
801
800
  end
802
801
 
803
802
  it "creates a criteria for a string" do
803
+ @criteria.expects(:one).returns(@document)
804
804
  Mongoid::Criteria.translate(Person, @id)
805
805
  end
806
806
 
807
+ context "when the document is not found" do
808
+
809
+ it "raises an error" do
810
+ @criteria.expects(:one).returns(nil)
811
+ lambda { Mongoid::Criteria.translate(Person, @id) }.should raise_error
812
+ end
813
+
814
+ end
815
+
807
816
  end
808
817
 
809
818
  context "multiple arguments" do
@@ -219,6 +219,30 @@ describe Mongoid::Document do
219
219
 
220
220
  end
221
221
 
222
+ context "when as is specified" do
223
+
224
+ before do
225
+ Person.field :aliased, :as => :alias, :type => Boolean
226
+ @person = Person.new(:alias => true)
227
+ end
228
+
229
+ it "uses the alias to write the attribute" do
230
+ @person.expects(:write_attribute).with(:aliased, true)
231
+ @person.alias = true
232
+ end
233
+
234
+ it "uses the alias to read the attribute" do
235
+ @person.expects(:read_attribute).with(:aliased)
236
+ @person.alias
237
+ end
238
+
239
+ it "uses the alias for the query method" do
240
+ @person.expects(:read_attribute).with(:aliased)
241
+ @person.alias?
242
+ end
243
+
244
+ end
245
+
222
246
  end
223
247
 
224
248
  describe ".human_name" do
@@ -314,6 +338,19 @@ describe Mongoid::Document do
314
338
 
315
339
  describe "#new" do
316
340
 
341
+ context "when passed a block" do
342
+
343
+ it "yields self to the block" do
344
+ person = Person.new do |p|
345
+ p.title = "Sir"
346
+ p.age = 60
347
+ end
348
+ person.title.should == "Sir"
349
+ person.age.should == 60
350
+ end
351
+
352
+ end
353
+
317
354
  context "with no attributes" do
318
355
 
319
356
  it "sets default attributes" do
@@ -679,12 +716,11 @@ describe Mongoid::Document do
679
716
 
680
717
  context "when the associated is nil" do
681
718
 
682
- it "fails when the association fails validation" do
719
+ it "returns false" do
683
720
  Person.class_eval do
684
721
  validates_associated :name
685
722
  end
686
723
  @person.valid?.should be_false
687
- @person.errors.on(:name).should_not be_nil
688
724
  end
689
725
 
690
726
  end
@@ -2,6 +2,26 @@ require "spec_helper"
2
2
 
3
3
  describe Mongoid::Errors do
4
4
 
5
+ describe Mongoid::Errors::DocumentNotFound do
6
+
7
+ describe "#message" do
8
+
9
+ context "default" do
10
+
11
+ before do
12
+ @error = Mongoid::Errors::DocumentNotFound.new(Person, "3")
13
+ end
14
+
15
+ it "contains document not found" do
16
+ @error.message.should include("Document not found")
17
+ end
18
+
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+
5
25
  describe Mongoid::Errors::InvalidOptions do
6
26
 
7
27
  describe "#message" do
@@ -83,6 +83,16 @@ describe Mongoid::Finders do
83
83
  Person.find(@id.to_s)
84
84
  end
85
85
 
86
+ context "when no document is found" do
87
+
88
+ it "raises an error" do
89
+ @error = Mongoid::Errors::DocumentNotFound.new(Person, @id.to_s)
90
+ Mongoid::Criteria.expects(:translate).with(Person, @id.to_s).raises(@error)
91
+ lambda { Person.find(@id.to_s) }.should raise_error
92
+ end
93
+
94
+ end
95
+
86
96
  end
87
97
 
88
98
  context "when finding first" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.9
4
+ version: 0.9.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Durran Jordan
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-12-13 00:00:00 -05:00
12
+ date: 2009-12-19 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -18,7 +18,7 @@ dependencies:
18
18
  version_requirement:
19
19
  version_requirements: !ruby/object:Gem::Requirement
20
20
  requirements:
21
- - - "="
21
+ - - ">="
22
22
  - !ruby/object:Gem::Version
23
23
  version: 1.8.3
24
24
  version:
@@ -28,7 +28,7 @@ dependencies:
28
28
  version_requirement:
29
29
  version_requirements: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "="
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: 2.3.11
34
34
  version:
@@ -38,7 +38,7 @@ dependencies:
38
38
  version_requirement:
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - "="
41
+ - - ">="
42
42
  - !ruby/object:Gem::Version
43
43
  version: 2.3.4
44
44
  version:
@@ -48,7 +48,7 @@ dependencies:
48
48
  version_requirement:
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - "="
51
+ - - ">="
52
52
  - !ruby/object:Gem::Version
53
53
  version: 0.18.1
54
54
  version:
@@ -58,7 +58,7 @@ dependencies:
58
58
  version_requirement:
59
59
  version_requirements: !ruby/object:Gem::Requirement
60
60
  requirements:
61
- - - "="
61
+ - - ">="
62
62
  - !ruby/object:Gem::Version
63
63
  version: 0.18.1
64
64
  version:
@@ -68,7 +68,7 @@ dependencies:
68
68
  version_requirement:
69
69
  version_requirements: !ruby/object:Gem::Requirement
70
70
  requirements:
71
- - - "="
71
+ - - ">="
72
72
  - !ruby/object:Gem::Version
73
73
  version: 1.2.9
74
74
  version:
@@ -78,7 +78,7 @@ dependencies:
78
78
  version_requirement:
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - "="
81
+ - - ">="
82
82
  - !ruby/object:Gem::Version
83
83
  version: 0.9.8
84
84
  version:
@@ -106,6 +106,7 @@ files:
106
106
  - lib/mongoid/associations/has_one.rb
107
107
  - lib/mongoid/associations/has_one_related.rb
108
108
  - lib/mongoid/associations/options.rb
109
+ - lib/mongoid/associations/proxy.rb
109
110
  - lib/mongoid/attributes.rb
110
111
  - lib/mongoid/commands.rb
111
112
  - lib/mongoid/commands/create.rb
@@ -146,6 +147,7 @@ files:
146
147
  - perf/benchmark.rb
147
148
  - spec/integration/mongoid/associations_spec.rb
148
149
  - spec/integration/mongoid/document_spec.rb
150
+ - spec/integration/mongoid/finders_spec.rb
149
151
  - spec/spec.opts
150
152
  - spec/spec_helper.rb
151
153
  - spec/unit/mongoid/associations/belongs_to_related_spec.rb
@@ -222,6 +224,7 @@ summary: ODM framework for MongoDB
222
224
  test_files:
223
225
  - spec/integration/mongoid/associations_spec.rb
224
226
  - spec/integration/mongoid/document_spec.rb
227
+ - spec/integration/mongoid/finders_spec.rb
225
228
  - spec/spec_helper.rb
226
229
  - spec/unit/mongoid/associations/belongs_to_related_spec.rb
227
230
  - spec/unit/mongoid/associations/belongs_to_spec.rb