mongoid 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.1
1
+ 1.1.2
@@ -76,10 +76,10 @@ module Mongoid #:nodoc
76
76
  :raise_not_found_error,
77
77
  :raise_not_found_error=, :to => :config
78
78
 
79
- protected
80
79
  def config
81
- Config.instance
80
+ yield Config.instance if block_given?; Config.instance
82
81
  end
82
+
83
83
  end
84
84
 
85
85
  end
@@ -74,9 +74,9 @@ module Mongoid #:nodoc:
74
74
  # essentially a proxy to an array itself.
75
75
  def initialize(document, options)
76
76
  @parent, @association_name, @klass, @options = document, options.name, options.klass, options
77
- attributes = document.attributes[@association_name]
77
+ attributes = document.raw_attributes[@association_name]
78
78
  @documents = attributes ? attributes.collect do |attrs|
79
- type = attrs[:_type]
79
+ type = attrs["_type"]
80
80
  child = type ? type.constantize.instantiate(attrs) : @klass.instantiate(attrs)
81
81
  child.parentize(@parent, @association_name)
82
82
  child
@@ -20,8 +20,9 @@ module Mongoid #:nodoc:
20
20
  # options: The association options.
21
21
  def initialize(document, attributes, options)
22
22
  @parent, @options, @association_name = document, options, options.name
23
- klass = attributes[:_type] ? attributes[:_type].constantize : nil
24
- @document = attributes.assimilate(@parent, @options, klass)
23
+ attrs = attributes.stringify_keys
24
+ klass = attrs["_type"] ? attrs["_type"].constantize : nil
25
+ @document = attrs.assimilate(@parent, @options, klass)
25
26
  end
26
27
 
27
28
  # Delegate all missing methods over to the +Document+.
@@ -61,7 +62,7 @@ module Mongoid #:nodoc:
61
62
  # document: The parent +Document+
62
63
  # options: The association options.
63
64
  def instantiate(document, options)
64
- attributes = document.attributes[options.name]
65
+ attributes = document.raw_attributes[options.name]
65
66
  return nil if attributes.blank?
66
67
  new(document, attributes, options)
67
68
  end
@@ -2,6 +2,7 @@
2
2
  module Mongoid #:nodoc:
3
3
  module Associations #:nodoc:
4
4
  class HasOneRelated #:nodoc:
5
+ include Proxy
5
6
 
6
7
  delegate :==, :nil?, :to => :document
7
8
  attr_reader :klass, :document
@@ -29,7 +29,7 @@ module Mongoid #:nodoc:
29
29
 
30
30
  # Returns the association name of the options.
31
31
  def name
32
- @attributes[:name]
32
+ @attributes[:name].to_s
33
33
  end
34
34
 
35
35
  # Returns the parent foreign key association name.
@@ -38,8 +38,8 @@ module Mongoid #:nodoc:
38
38
  # field exists for them on the +Document+. This will be limited to only the
39
39
  # attributes provided in the suppied +Hash+ so that no extra nil values get
40
40
  # put into the document's attributes.
41
- def process(attrs = {})
42
- attrs.each_pair do |key, value|
41
+ def process(attrs = nil)
42
+ (attrs || {}).each_pair do |key, value|
43
43
  if Mongoid.allow_dynamic_fields && !respond_to?("#{key}=")
44
44
  @attributes[key.to_s] = value
45
45
  else
@@ -210,8 +210,9 @@ module Mongoid #:nodoc:
210
210
  # <tt>criteria.id("4ab2bc4b8ad548971900005c")</tt>
211
211
  #
212
212
  # Returns: <tt>self</tt>
213
- def id(object_id)
214
- @selector[:_id] = object_id; self
213
+ def id(*args)
214
+ (args.flatten.size > 1) ? self.in(:_id => args.flatten) : (@selector[:_id] = *args)
215
+ self
215
216
  end
216
217
 
217
218
  # Create the new +Criteria+ object. This will initialize the selector
@@ -410,12 +411,8 @@ module Mongoid #:nodoc:
410
411
  def self.translate(*args)
411
412
  klass = args[0]
412
413
  params = args[1] || {}
413
- if params.is_a?(String)
414
- document = new(klass).id(params).one
415
- if Mongoid.raise_not_found_error
416
- raise Errors::DocumentNotFound.new(klass, params) unless document
417
- end
418
- return document
414
+ unless params.is_a?(Hash)
415
+ return id_criteria(klass, params)
419
416
  end
420
417
  return new(klass).where(params.delete(:conditions) || {}).extras(params)
421
418
  end
@@ -472,5 +469,16 @@ module Mongoid #:nodoc:
472
469
  attributes.each { |key, value| @selector[key] = { operator => value } }; self
473
470
  end
474
471
 
472
+ class << self
473
+ # Return a criteria or single document based on an id search.
474
+ def id_criteria(klass, params)
475
+ criteria = new(klass).id(params)
476
+ result = params.is_a?(String) ? criteria.one : criteria.entries
477
+ if Mongoid.raise_not_found_error
478
+ raise Errors::DocumentNotFound.new(klass, params) if result.blank?
479
+ end
480
+ return result
481
+ end
482
+ end
475
483
  end
476
484
  end
@@ -58,10 +58,11 @@ module Mongoid #:nodoc:
58
58
  # Example:
59
59
  #
60
60
  # <tt>Person.instantiate(:title => "Sir", :age => 30)</tt>
61
- def instantiate(attrs = {}, allocating = false)
62
- if attrs["_id"] || allocating
61
+ def instantiate(attrs = nil, allocating = false)
62
+ attributes = attrs || {}
63
+ if attributes["_id"] || allocating
63
64
  document = allocate
64
- document.instance_variable_set(:@attributes, attrs)
65
+ document.instance_variable_set(:@attributes, attributes)
65
66
  return document
66
67
  else
67
68
  return new(attrs)
@@ -160,7 +161,7 @@ module Mongoid #:nodoc:
160
161
  # Example:
161
162
  #
162
163
  # <tt>Person.new(:title => "Mr", :age => 30)</tt>
163
- def initialize(attrs = {})
164
+ def initialize(attrs = nil)
164
165
  @attributes = {}
165
166
  process(attrs)
166
167
  @attributes = attributes_with_defaults(@attributes)
@@ -172,7 +173,7 @@ module Mongoid #:nodoc:
172
173
  # apply default values to attributes - calling procs as required
173
174
  def attributes_with_defaults(attributes = {})
174
175
  default_values = defaults.merge(attributes)
175
- default_values.each do |key, val|
176
+ default_values.each_pair do |key, val|
176
177
  default_values[key] = val.call if val.respond_to?(:call)
177
178
  end
178
179
  end
@@ -237,7 +238,7 @@ module Mongoid #:nodoc:
237
238
  # memoized association and notify the parent of the change.
238
239
  def remove(child)
239
240
  name = child.association_name
240
- reset(name) { @attributes.remove(name, child.attributes) }
241
+ reset(name) { @attributes.remove(name, child.raw_attributes) }
241
242
  notify
242
243
  end
243
244
 
@@ -5,11 +5,11 @@ module Mongoid #:nodoc
5
5
  # Raised when querying the database for a document by a specific id which
6
6
  # does not exist.
7
7
  class DocumentNotFound < RuntimeError
8
- def initialize(klass, identifier)
9
- @klass, @identifier = klass, identifier
8
+ def initialize(klass, ids)
9
+ @klass, @identifier = klass, ids.is_a?(Array) ? ids.join(", ") : ids
10
10
  end
11
11
  def message
12
- "Document not found for class #{@klass} and id #{@identifier}"
12
+ "Document not found for class #{@klass} and id(s) #{@identifier}"
13
13
  end
14
14
  end
15
15
 
@@ -20,7 +20,7 @@ module Mongoid #:nodoc:
20
20
  def assimilate(parent, options, type = nil)
21
21
  klass = type ? type : options.klass
22
22
  child = klass.instantiate(:_parent => parent)
23
- child.write_attributes(self.merge(:_type => klass.name))
23
+ child.write_attributes(self.merge("_type" => klass.name))
24
24
  child.identify
25
25
  child.assimilate(parent, options)
26
26
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mongoid}
8
- s.version = "1.1.1"
8
+ s.version = "1.1.2"
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{2010-01-22}
12
+ s.date = %q{2010-01-23}
13
13
  s.email = %q{durran@gmail.com}
14
14
  s.extra_rdoc_files = [
15
15
  "README.rdoc"
@@ -94,12 +94,75 @@ describe Mongoid::Associations do
94
94
 
95
95
  before do
96
96
  @extra_post = Post.create(:title => "Orphan")
97
+ @from_db = Person.find(@person.id)
97
98
  end
98
99
 
99
- it "returns only those objects scoped to the parent" do
100
- from_db = Person.find(@person.id)
101
- Post.all.size.should == 2
102
- from_db.posts.all.size.should == 1
100
+ context "finding all" do
101
+
102
+ it "returns only those objects scoped to the parent" do
103
+ Post.all.size.should == 2
104
+ @from_db.posts.all.size.should == 1
105
+ end
106
+
107
+ end
108
+
109
+ context "finding with conditions" do
110
+
111
+ context "finding all" do
112
+
113
+ it "returns only those objects scoped to the parent" do
114
+ posts = @from_db.posts.find(:all, :conditions => { :title => "Testing" })
115
+ posts.size.should == 1
116
+ end
117
+
118
+ end
119
+
120
+ context "finding first" do
121
+
122
+ it "returns only those objects scoped to the parent" do
123
+ post = @from_db.posts.find(:first, :conditions => { :title => "Testing" })
124
+ post.should == @post
125
+ end
126
+
127
+ end
128
+
129
+ context "finding last" do
130
+
131
+ it "returns only those objects scoped to the parent" do
132
+ post = @from_db.posts.find(:last, :conditions => { :title => "Testing" })
133
+ post.should == @post
134
+ end
135
+
136
+ end
137
+
138
+ context "using a named scope" do
139
+
140
+ before do
141
+ @post.created_at = 15.days.ago
142
+ @post.save
143
+ end
144
+
145
+ it "returns only those scoped to the parent plus the named scope" do
146
+ posts = @from_db.posts.recent
147
+ posts.size.should == 1
148
+ end
149
+
150
+ end
151
+
152
+ context "using a criteria class method" do
153
+
154
+ before do
155
+ @post.created_at = 45.days.ago
156
+ @post.save
157
+ end
158
+
159
+ it "returns only those scoped to the parent plus the named scope" do
160
+ posts = @from_db.posts.old
161
+ posts.size.should == 1
162
+ end
163
+
164
+ end
165
+
103
166
  end
104
167
 
105
168
  end
@@ -3,7 +3,7 @@ require "spec_helper"
3
3
  describe Mongoid::Commands do
4
4
 
5
5
  before do
6
- @person = Person.new(:title => "Sir")
6
+ @person = Person.new(:title => "Sir", :ssn => "6969696")
7
7
  end
8
8
 
9
9
  after do
@@ -13,7 +13,7 @@ describe Mongoid::Commands do
13
13
  describe ".create" do
14
14
 
15
15
  it "saves and returns the document" do
16
- person = Person.create(:title => "Sensei")
16
+ person = Person.create(:title => "Sensei", :ssn => "666-66-6666")
17
17
  person.should be_a_kind_of(Person)
18
18
  person.should_not be_a_new_record
19
19
  end
@@ -5,7 +5,11 @@ describe Mongoid::Finders do
5
5
  describe "#find" do
6
6
 
7
7
  before do
8
+ @documents = []
8
9
  @document = Person.create(:title => "Mrs.", :ssn => "another")
10
+ 3.times do |n|
11
+ @documents << Person.create(:title => "Mr.", :ssn => "#{n}22")
12
+ end
9
13
  end
10
14
 
11
15
  after do
@@ -32,6 +36,27 @@ describe Mongoid::Finders do
32
36
 
33
37
  end
34
38
 
39
+ context "with an array of ids as args" do
40
+
41
+ context "when the documents are found" do
42
+
43
+ it "returns an array of the documents" do
44
+ @people = Person.find(@documents.map(&:id))
45
+ @people.should == @documents
46
+ end
47
+
48
+ end
49
+
50
+ context "when no documents found" do
51
+
52
+ it "raises an error" do
53
+ lambda { Person.find(["11", "21", "31"]) }.should raise_error
54
+ end
55
+
56
+ end
57
+
58
+ end
59
+
35
60
  end
36
61
 
37
62
  end
@@ -218,6 +218,14 @@ class Post
218
218
  include Mongoid::Timestamps
219
219
  field :title
220
220
  belongs_to_related :person
221
+
222
+ named_scope :recent, where(:created_at => { "$lt" => Time.now, "$gt" => 30.days.ago })
223
+
224
+ class << self
225
+ def old
226
+ where(:created_at => { "$lt" => 30.days.ago })
227
+ end
228
+ end
221
229
  end
222
230
 
223
231
  class Game
@@ -3,16 +3,19 @@ require "spec_helper"
3
3
  describe Mongoid::Associations::HasMany do
4
4
 
5
5
  before do
6
- @attributes = { :addresses => [
7
- { :_id => "street-1", :street => "Street 1", :state => "CA" },
8
- { :_id => "street-2", :street => "Street 2" } ] }
9
- @document = stub(:attributes => @attributes, :add_observer => true, :update => true)
6
+ @attributes = { "addresses" => [
7
+ { "_id" => "street-1", "street" => "Street 1", "state" => "CA" },
8
+ { "_id" => "street-2", "street" => "Street 2" } ] }
9
+ @document = stub(:raw_attributes => @attributes, :add_observer => true, :update => true)
10
10
  end
11
11
 
12
12
  describe "#[]" do
13
13
 
14
14
  before do
15
- @association = Mongoid::Associations::HasMany.new(@document, Mongoid::Associations::Options.new(:name => :addresses))
15
+ @association = Mongoid::Associations::HasMany.new(
16
+ @document,
17
+ Mongoid::Associations::Options.new(:name => :addresses)
18
+ )
16
19
  end
17
20
 
18
21
  context "when the index is present in the association" do
@@ -257,7 +260,7 @@ describe Mongoid::Associations::HasMany do
257
260
  describe "#initialize" do
258
261
 
259
262
  before do
260
- @canvas = stub(:attributes => { :shapes => [{ :_type => "Circle", :radius => 5 }] }, :update => true)
263
+ @canvas = stub(:raw_attributes => { "shapes" => [{ "_type" => "Circle", "radius" => 5 }] }, :update => true)
261
264
  @association = Mongoid::Associations::HasMany.new(
262
265
  @canvas,
263
266
  Mongoid::Associations::Options.new(:name => :shapes)
@@ -55,6 +55,21 @@ describe Mongoid::Associations::HasOneRelated do
55
55
 
56
56
  end
57
57
 
58
+ describe "#id" do
59
+
60
+ before do
61
+ @parent = stub(:id => "5", :class => Person)
62
+ @game = Game.new
63
+ Game.expects(:first).returns(@game)
64
+ @association = Mongoid::Associations::HasOneRelated.new(@parent, options)
65
+ end
66
+
67
+ it "delegates to the proxied document" do
68
+ @association.id.should == @game.id
69
+ end
70
+
71
+ end
72
+
58
73
  describe ".initialize" do
59
74
 
60
75
  before do
@@ -3,11 +3,11 @@ require "spec_helper"
3
3
  describe Mongoid::Associations::HasOne do
4
4
 
5
5
  before do
6
- @attributes = { :mixed_drink => {
7
- :name => "Jack and Coke", :_type => "MixedDrink" },
8
- :writer => { :speed => 50, :_type => "HtmlWriter" }
6
+ @attributes = { "mixed_drink" => {
7
+ "name" => "Jack and Coke", "_type" => "MixedDrink" },
8
+ "writer" => { "speed" => 50, "_type" => "HtmlWriter" }
9
9
  }
10
- @document = stub(:attributes => @attributes, :update => true)
10
+ @document = stub(:raw_attributes => @attributes, :update => true)
11
11
  end
12
12
 
13
13
  describe "#build_*" do
@@ -17,7 +17,7 @@ describe Mongoid::Associations::HasOne do
17
17
  before do
18
18
  @association = Mongoid::Associations::HasOne.new(
19
19
  @document,
20
- @attributes[:mixed_drink],
20
+ @attributes["mixed_drink"],
21
21
  Mongoid::Associations::Options.new(:name => :mixed_drink)
22
22
  )
23
23
  end
@@ -34,7 +34,7 @@ describe Mongoid::Associations::HasOne do
34
34
  before do
35
35
  @association = Mongoid::Associations::HasOne.new(
36
36
  @document,
37
- @attributes[:writer],
37
+ @attributes["writer"],
38
38
  Mongoid::Associations::Options.new(:name => :writer)
39
39
  )
40
40
  end
@@ -84,7 +84,7 @@ describe Mongoid::Associations::HasOne do
84
84
  context "when attributes are empty" do
85
85
 
86
86
  before do
87
- @document = stub(:attributes => { :name => {} })
87
+ @document = stub(:raw_attributes => { "name" => {} })
88
88
  @association = Mongoid::Associations::HasOne.instantiate(
89
89
  @document,
90
90
  Mongoid::Associations::Options.new(:name => :name)
@@ -100,12 +100,12 @@ describe Mongoid::Associations::HasOne do
100
100
  context "when attributes exist" do
101
101
 
102
102
  before do
103
- @document = stub(:attributes => { :name => { :first_name => "Test" } })
103
+ @document = stub(:raw_attributes => { "name" => { "first_name" => "Test" } })
104
104
  @options = Mongoid::Associations::Options.new(:name => :name)
105
105
  end
106
106
 
107
107
  it "delegates to new" do
108
- Mongoid::Associations::HasOne.expects(:new).with(@document, { :first_name => "Test" }, @options)
108
+ Mongoid::Associations::HasOne.expects(:new).with(@document, { "first_name" => "Test" }, @options)
109
109
  Mongoid::Associations::HasOne.instantiate(@document, @options)
110
110
  end
111
111
 
@@ -118,7 +118,7 @@ describe Mongoid::Associations::HasOne do
118
118
  before do
119
119
  @association = Mongoid::Associations::HasOne.new(
120
120
  @document,
121
- @attributes[:mixed_drink],
121
+ @attributes["mixed_drink"],
122
122
  Mongoid::Associations::Options.new(:name => :mixed_drink)
123
123
  )
124
124
  end
@@ -149,7 +149,7 @@ describe Mongoid::Associations::HasOne do
149
149
  before do
150
150
  @association = Mongoid::Associations::HasOne.new(
151
151
  @document,
152
- @attributes[:mixed_drink],
152
+ @attributes["mixed_drink"],
153
153
  Mongoid::Associations::Options.new(:name => :mixed_drink)
154
154
  )
155
155
  end
@@ -221,7 +221,7 @@ describe Mongoid::Associations::HasOne do
221
221
  context "when the document is not nil" do
222
222
 
223
223
  before do
224
- @document = stub(:attributes => { :name => { :first_name => "Test" } }, :update => true)
224
+ @document = stub(:raw_attributes => { "name" => { "first_name" => "Test" } }, :update => true)
225
225
  @options = Mongoid::Associations::Options.new(:name => :name)
226
226
  @association = Mongoid::Associations::HasOne.instantiate(@document, @options)
227
227
  end
@@ -10,7 +10,7 @@ describe Mongoid::Associations::Options do
10
10
  end
11
11
 
12
12
  it "returns the association name" do
13
- @options.name.should == :addresses
13
+ @options.name.should == "addresses"
14
14
  end
15
15
 
16
16
  end
@@ -497,7 +497,12 @@ describe Mongoid::Criteria do
497
497
  end
498
498
 
499
499
  it "calls group on the collection with the aggregate js" do
500
- @collection.expects(:group).with([:field1], {:_type => { "$in" => ["Doctor", "Person"] }}, {:group => []}, @reduce, true).returns(@grouping)
500
+ @collection.expects(:group).with(
501
+ [ :field1 ],
502
+ { :_type =>
503
+ { "$in" => ["Doctor", "Person"] }},
504
+ {:group => []}, @reduce, true
505
+ ).returns(@grouping)
501
506
  @criteria.only(:field1).group
502
507
  end
503
508
 
@@ -512,7 +517,11 @@ describe Mongoid::Criteria do
512
517
  end
513
518
 
514
519
  it "calls group on the collection with the aggregate js" do
515
- @collection.expects(:group).with([:field1], {:_type => { "$in" => ["Doctor", "Person"] }}, {:group => []}, @reduce, true).returns(@grouping)
520
+ @collection.expects(:group).with(
521
+ [ :field1 ],
522
+ { :_type =>
523
+ { "$in" => ["Doctor", "Person"] }
524
+ }, { :group => []}, @reduce, true).returns(@grouping)
516
525
  @criteria.only(:field1).group
517
526
  end
518
527
 
@@ -522,15 +531,34 @@ describe Mongoid::Criteria do
522
531
 
523
532
  describe "#id" do
524
533
 
525
- it "adds the _id query to the selector" do
526
- id = Mongo::ObjectID.new.to_s
527
- @criteria.id(id)
528
- @criteria.selector.should == { :_type => { "$in" => ["Doctor", "Person"] }, :_id => id }
534
+ context "when passing a single id" do
535
+
536
+ it "adds the _id query to the selector" do
537
+ id = Mongo::ObjectID.new.to_s
538
+ @criteria.id(id)
539
+ @criteria.selector.should == { :_type => { "$in" => ["Doctor", "Person"] }, :_id => id }
540
+ end
541
+
542
+ it "returns self" do
543
+ id = Mongo::ObjectID.new.to_s
544
+ @criteria.id(id.to_s).should == @criteria
545
+ end
546
+
529
547
  end
530
548
 
531
- it "returns self" do
532
- id = Mongo::ObjectID.new.to_s
533
- @criteria.id(id.to_s).should == @criteria
549
+ context "when passing in an array of ids" do
550
+
551
+ before do
552
+ @ids = []
553
+ 3.times { @ids << Mongo::ObjectID.new.to_s }
554
+ end
555
+
556
+ it "adds the _id query to the selector" do
557
+ @criteria.id(@ids)
558
+ @criteria.selector.should ==
559
+ { :_type => { "$in" => ["Doctor", "Person"] }, :_id => { "$in" => @ids } }
560
+ end
561
+
534
562
  end
535
563
 
536
564
  end
@@ -539,7 +567,12 @@ describe Mongoid::Criteria do
539
567
 
540
568
  it "adds the $in clause to the selector" do
541
569
  @criteria.in(:title => ["title1", "title2"], :text => ["test"])
542
- @criteria.selector.should == { :_type => { "$in" => ["Doctor", "Person"] }, :title => { "$in" => ["title1", "title2"] }, :text => { "$in" => ["test"] } }
570
+ @criteria.selector.should ==
571
+ { :_type =>
572
+ { "$in" =>
573
+ ["Doctor", "Person"]
574
+ }, :title => { "$in" => ["title1", "title2"] }, :text => { "$in" => ["test"] }
575
+ }
543
576
  end
544
577
 
545
578
  it "returns self" do
@@ -969,7 +1002,11 @@ describe Mongoid::Criteria do
969
1002
  @collection = mock
970
1003
  Person.expects(:collection).returns(@collection)
971
1004
  @criteria = Person.where(:_id => "1").skip(60).limit(20)
972
- @collection.expects(:find).with({:_type => { "$in" => ["Doctor", "Person"] }, :_id => "1"}, :skip => 60, :limit => 20).returns([])
1005
+ @collection.expects(:find).with(
1006
+ { :_type =>
1007
+ { "$in" => ["Doctor", "Person"] },
1008
+ :_id => "1"
1009
+ }, :skip => 60, :limit => 20).returns([])
973
1010
  @results = @criteria.paginate
974
1011
  end
975
1012
 
@@ -1112,6 +1149,7 @@ describe Mongoid::Criteria do
1112
1149
 
1113
1150
  it "creates a criteria for a string" do
1114
1151
  @criteria.expects(:one).returns(@document)
1152
+ @document.expects(:blank? => false)
1115
1153
  Mongoid::Criteria.translate(Person, @id)
1116
1154
  end
1117
1155
 
@@ -1128,6 +1166,53 @@ describe Mongoid::Criteria do
1128
1166
 
1129
1167
  context "multiple arguments" do
1130
1168
 
1169
+ context "when an array of ids" do
1170
+
1171
+ before do
1172
+ @ids = []
1173
+ @documents = []
1174
+ 3.times do
1175
+ @ids << Mongo::ObjectID.new.to_s
1176
+ @documents << stub
1177
+ end
1178
+ @collection = stub
1179
+ Person.expects(:collection).returns(@collection)
1180
+ end
1181
+
1182
+ context "when documents are found" do
1183
+
1184
+ it "returns an ids criteria" do
1185
+ @collection.expects(:find).with(
1186
+ { :_type =>
1187
+ { "$in" =>
1188
+ ["Doctor", "Person"]
1189
+ },
1190
+ :_id =>
1191
+ { "$in" => @ids }
1192
+ }, {}).returns([{ "_id" => "4", "title" => "Sir", "_type" => "Person" }])
1193
+ @criteria = Mongoid::Criteria.translate(Person, @ids)
1194
+ end
1195
+
1196
+ end
1197
+
1198
+ context "when documents are not found" do
1199
+
1200
+ it "returns an ids criteria" do
1201
+ @collection.expects(:find).with(
1202
+ { :_type =>
1203
+ { "$in" =>
1204
+ ["Doctor", "Person"]
1205
+ },
1206
+ :_id =>
1207
+ { "$in" => @ids }
1208
+ }, {}).returns([])
1209
+ lambda { Mongoid::Criteria.translate(Person, @ids) }.should raise_error
1210
+ end
1211
+
1212
+ end
1213
+
1214
+ end
1215
+
1131
1216
  context "when Person, :conditions => {}" do
1132
1217
 
1133
1218
  before do
@@ -1200,7 +1285,8 @@ describe Mongoid::Criteria do
1200
1285
 
1201
1286
  it "adds the clause to the selector" do
1202
1287
  @criteria.where(:title => "Title", :text => "Text")
1203
- @criteria.selector.should == { :_type => { "$in" => ["Doctor", "Person"] }, :title => "Title", :text => "Text" }
1288
+ @criteria.selector.should ==
1289
+ { :_type => { "$in" => ["Doctor", "Person"] }, :title => "Title", :text => "Text" }
1204
1290
  end
1205
1291
 
1206
1292
  end
@@ -1211,7 +1297,8 @@ describe Mongoid::Criteria do
1211
1297
 
1212
1298
  it "returns those matching an all clause" do
1213
1299
  @criteria.where(:title.all => ["Sir"])
1214
- @criteria.selector.should == { :_type => { "$in" => ["Doctor", "Person"] }, :title => { "$all" => ["Sir"] } }
1300
+ @criteria.selector.should ==
1301
+ { :_type => { "$in" => ["Doctor", "Person"] }, :title => { "$all" => ["Sir"] } }
1215
1302
  end
1216
1303
 
1217
1304
  end
@@ -1220,7 +1307,8 @@ describe Mongoid::Criteria do
1220
1307
 
1221
1308
  it "returns those matching an exists clause" do
1222
1309
  @criteria.where(:title.exists => true)
1223
- @criteria.selector.should == { :_type => { "$in" => ["Doctor", "Person"] }, :title => { "$exists" => true } }
1310
+ @criteria.selector.should ==
1311
+ { :_type => { "$in" => ["Doctor", "Person"] }, :title => { "$exists" => true } }
1224
1312
  end
1225
1313
 
1226
1314
  end
@@ -1229,7 +1317,8 @@ describe Mongoid::Criteria do
1229
1317
 
1230
1318
  it "returns those matching a gt clause" do
1231
1319
  @criteria.where(:age.gt => 30)
1232
- @criteria.selector.should == { :_type => { "$in" => ["Doctor", "Person"] }, :age => { "$gt" => 30 } }
1320
+ @criteria.selector.should ==
1321
+ { :_type => { "$in" => ["Doctor", "Person"] }, :age => { "$gt" => 30 } }
1233
1322
  end
1234
1323
 
1235
1324
  end
@@ -1238,7 +1327,8 @@ describe Mongoid::Criteria do
1238
1327
 
1239
1328
  it "returns those matching a gte clause" do
1240
1329
  @criteria.where(:age.gte => 33)
1241
- @criteria.selector.should == { :_type => { "$in" => ["Doctor", "Person"] }, :age => { "$gte" => 33 } }
1330
+ @criteria.selector.should ==
1331
+ { :_type => { "$in" => ["Doctor", "Person"] }, :age => { "$gte" => 33 } }
1242
1332
  end
1243
1333
 
1244
1334
  end
@@ -1247,7 +1337,8 @@ describe Mongoid::Criteria do
1247
1337
 
1248
1338
  it "returns those matching an in clause" do
1249
1339
  @criteria.where(:title.in => ["Sir", "Madam"])
1250
- @criteria.selector.should == { :_type => { "$in" => ["Doctor", "Person"] }, :title => { "$in" => ["Sir", "Madam"] } }
1340
+ @criteria.selector.should ==
1341
+ { :_type => { "$in" => ["Doctor", "Person"] }, :title => { "$in" => ["Sir", "Madam"] } }
1251
1342
  end
1252
1343
 
1253
1344
  end
@@ -1256,7 +1347,8 @@ describe Mongoid::Criteria do
1256
1347
 
1257
1348
  it "returns those matching a lt clause" do
1258
1349
  @criteria.where(:age.lt => 34)
1259
- @criteria.selector.should == { :_type => { "$in" => ["Doctor", "Person"] }, :age => { "$lt" => 34 } }
1350
+ @criteria.selector.should ==
1351
+ { :_type => { "$in" => ["Doctor", "Person"] }, :age => { "$lt" => 34 } }
1260
1352
  end
1261
1353
 
1262
1354
  end
@@ -1265,7 +1357,8 @@ describe Mongoid::Criteria do
1265
1357
 
1266
1358
  it "returns those matching a lte clause" do
1267
1359
  @criteria.where(:age.lte => 33)
1268
- @criteria.selector.should == { :_type => { "$in" => ["Doctor", "Person"] }, :age => { "$lte" => 33 } }
1360
+ @criteria.selector.should ==
1361
+ { :_type => { "$in" => ["Doctor", "Person"] }, :age => { "$lte" => 33 } }
1269
1362
  end
1270
1363
 
1271
1364
  end
@@ -1274,7 +1367,8 @@ describe Mongoid::Criteria do
1274
1367
 
1275
1368
  it "returns those matching a ne clause" do
1276
1369
  @criteria.where(:age.ne => 50)
1277
- @criteria.selector.should == { :_type => { "$in" => ["Doctor", "Person"] }, :age => { "$ne" => 50 } }
1370
+ @criteria.selector.should ==
1371
+ { :_type => { "$in" => ["Doctor", "Person"] }, :age => { "$ne" => 50 } }
1278
1372
  end
1279
1373
 
1280
1374
  end
@@ -1283,7 +1377,8 @@ describe Mongoid::Criteria do
1283
1377
 
1284
1378
  it "returns those matching a nin clause" do
1285
1379
  @criteria.where(:title.nin => ["Esquire", "Congressman"])
1286
- @criteria.selector.should == { :_type => { "$in" => ["Doctor", "Person"] }, :title => { "$nin" => ["Esquire", "Congressman"] } }
1380
+ @criteria.selector.should ==
1381
+ { :_type => { "$in" => ["Doctor", "Person"] }, :title => { "$nin" => ["Esquire", "Congressman"] } }
1287
1382
  end
1288
1383
 
1289
1384
  end
@@ -1292,7 +1387,8 @@ describe Mongoid::Criteria do
1292
1387
 
1293
1388
  it "returns those matching a size clause" do
1294
1389
  @criteria.where(:aliases.size => 2)
1295
- @criteria.selector.should == { :_type => { "$in" => ["Doctor", "Person"] }, :aliases => { "$size" => 2 } }
1390
+ @criteria.selector.should ==
1391
+ { :_type => { "$in" => ["Doctor", "Person"] }, :aliases => { "$size" => 2 } }
1296
1392
  end
1297
1393
 
1298
1394
  end
@@ -1305,7 +1401,8 @@ describe Mongoid::Criteria do
1305
1401
 
1306
1402
  it "adds the $where clause to the selector" do
1307
1403
  @criteria.where("this.date < new Date()")
1308
- @criteria.selector.should == { :_type => { "$in" => ["Doctor", "Person"] }, "$where" => "this.date < new Date()" }
1404
+ @criteria.selector.should ==
1405
+ { :_type => { "$in" => ["Doctor", "Person"] }, "$where" => "this.date < new Date()" }
1309
1406
  end
1310
1407
 
1311
1408
  end
@@ -223,68 +223,7 @@ describe Mongoid::Document do
223
223
 
224
224
  end
225
225
 
226
- describe ".instantiate" do
227
-
228
- before do
229
- @attributes = { :_id => "1", :_type => "Person", :title => "Sir", :age => 30 }
230
- @person = Person.new(@attributes)
231
- end
232
-
233
- it "sets the attributes directly" do
234
- Person.instantiate(@attributes).should == @person
235
- end
236
-
237
- end
238
-
239
- describe ".key" do
240
-
241
- context "when key is single field" do
242
-
243
- before do
244
- Address.key :street
245
- @address = Address.new(:street => "Testing Street Name")
246
- @address.expects(:collection).returns(@collection)
247
- @collection.expects(:save)
248
- end
249
-
250
- it "adds the callback for primary key generation" do
251
- @address.save
252
- @address.id.should == "testing-street-name"
253
- end
254
-
255
- end
256
-
257
- context "when key is composite" do
258
-
259
- before do
260
- Address.key :street, :post_code
261
- @address = Address.new(:street => "Testing Street Name", :post_code => "94123")
262
- @address.expects(:collection).returns(@collection)
263
- @collection.expects(:save)
264
- end
265
-
266
- it "combines all fields" do
267
- @address.save
268
- @address.id.should == "testing-street-name-94123"
269
- end
270
-
271
- end
272
-
273
- context "when key is on a subclass" do
274
-
275
- before do
276
- Firefox.key :name
277
- end
278
-
279
- it "sets the key for the entire hierarchy" do
280
- Canvas.primary_key.should == [:name]
281
- end
282
-
283
- end
284
-
285
- end
286
-
287
- describe "#new" do
226
+ describe ".initialize" do
288
227
 
289
228
  context "when passed a block" do
290
229
 
@@ -310,6 +249,20 @@ describe Mongoid::Document do
310
249
 
311
250
  end
312
251
 
252
+ context "with nil attributes" do
253
+
254
+ before do
255
+ @person = Person.new(nil)
256
+ end
257
+
258
+ it "sets default attributes" do
259
+ @person.attributes.empty?.should be_false
260
+ @person.age.should == 100
261
+ @person.blood_alcohol_content.should == 0.0
262
+ end
263
+
264
+ end
265
+
313
266
  context "with attributes" do
314
267
 
315
268
  before do
@@ -363,6 +316,83 @@ describe Mongoid::Document do
363
316
 
364
317
  end
365
318
 
319
+ describe ".instantiate" do
320
+
321
+ context "when attributes have an id" do
322
+
323
+ before do
324
+ @attributes = { "_id" => "1", "_type" => "Person", "title" => "Sir", "age" => 30 }
325
+ end
326
+
327
+ it "sets the attributes directly" do
328
+ person = Person.instantiate(@attributes)
329
+ person._id.should == "1"
330
+ person._type.should == "Person"
331
+ person.title.should == "Sir"
332
+ person.age.should == 30
333
+ end
334
+
335
+ end
336
+
337
+ context "with nil attributes" do
338
+
339
+ it "sets the attributes directly" do
340
+ person = Person.instantiate(nil)
341
+ person.id.should_not be_nil
342
+ end
343
+
344
+ end
345
+
346
+ end
347
+
348
+ describe ".key" do
349
+
350
+ context "when key is single field" do
351
+
352
+ before do
353
+ Address.key :street
354
+ @address = Address.new(:street => "Testing Street Name")
355
+ @address.expects(:collection).returns(@collection)
356
+ @collection.expects(:save)
357
+ end
358
+
359
+ it "adds the callback for primary key generation" do
360
+ @address.save
361
+ @address.id.should == "testing-street-name"
362
+ end
363
+
364
+ end
365
+
366
+ context "when key is composite" do
367
+
368
+ before do
369
+ Address.key :street, :post_code
370
+ @address = Address.new(:street => "Testing Street Name", :post_code => "94123")
371
+ @address.expects(:collection).returns(@collection)
372
+ @collection.expects(:save)
373
+ end
374
+
375
+ it "combines all fields" do
376
+ @address.save
377
+ @address.id.should == "testing-street-name-94123"
378
+ end
379
+
380
+ end
381
+
382
+ context "when key is on a subclass" do
383
+
384
+ before do
385
+ Firefox.key :name
386
+ end
387
+
388
+ it "sets the key for the entire hierarchy" do
389
+ Canvas.primary_key.should == [:name]
390
+ end
391
+
392
+ end
393
+
394
+ end
395
+
366
396
  describe "#new_record?" do
367
397
 
368
398
  context "when the object has been saved" do
@@ -95,6 +95,19 @@ describe Mongoid::Finders do
95
95
 
96
96
  end
97
97
 
98
+ context "when an array of ids is passed in" do
99
+
100
+ before do
101
+ @ids = []
102
+ 3.times { @ids << Mongo::ObjectID.new.to_s }
103
+ end
104
+
105
+ it "delegates to the criteria" do
106
+
107
+ end
108
+
109
+ end
110
+
98
111
  context "when nil passed in" do
99
112
 
100
113
  it "raises an error" do
@@ -2,16 +2,34 @@ require "spec_helper"
2
2
 
3
3
  describe Mongoid do
4
4
 
5
- describe ".method_missing" do
5
+ describe ".config" do
6
+
7
+ context "when no block supplied" do
8
+
9
+ it "returns the config singleton" do
10
+ Mongoid.config.should == Mongoid::Config.instance
11
+ end
6
12
 
7
- before do
8
- @config = mock
9
- Mongoid::Config.expects(:instance).returns(@config)
10
13
  end
11
14
 
12
- it "delegates all calls to the config singleton" do
13
- @config.expects(:raise_not_found_error=).with(false)
14
- Mongoid.raise_not_found_error = false
15
+ context "when a block is supplied" do
16
+
17
+ before do
18
+ Mongoid.config do |config|
19
+ config.allow_dynamic_fields = false
20
+ end
21
+ end
22
+
23
+ after do
24
+ Mongoid.config do |config|
25
+ config.allow_dynamic_fields = true
26
+ end
27
+ end
28
+
29
+ it "sets the values on the config instance" do
30
+ Mongoid.allow_dynamic_fields.should be_false
31
+ end
32
+
15
33
  end
16
34
 
17
35
  end
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: 1.1.1
4
+ version: 1.1.2
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: 2010-01-22 00:00:00 -05:00
12
+ date: 2010-01-23 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency