mongoid 1.1.1 → 1.1.2

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