mongoid 0.9.9 → 0.9.10

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.
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