mongoid 0.2.7 → 0.3.0

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.
@@ -17,6 +17,7 @@
17
17
 
18
18
  <a href="http://www.pivotaltracker.com/projects/27482">Mongoid on Pivotal Tracker</a>
19
19
  <a href="http://groups.google.com/group/mongoid">Mongoid Google Group</a>
20
+ <a href="http://ci.hshrckt.com:4891/">Mongoid on CI Joe</a>
20
21
 
21
22
  <h3>Compatibility</h3>
22
23
 
data/Rakefile CHANGED
@@ -12,6 +12,8 @@ begin
12
12
  gem.email = "durran@gmail.com"
13
13
  gem.homepage = "http://github.com/durran/mongoid"
14
14
  gem.authors = ["Durran Jordan"]
15
+ gem.add_dependency "durran-validatable"
16
+ gem.add_dependency "mislav-will_paginate"
15
17
  gem.add_dependency "activesupport"
16
18
  gem.add_dependency "mongodb-mongo"
17
19
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.7
1
+ 0.3.0
@@ -31,14 +31,8 @@ require "active_support/core_ext"
31
31
  require "delegate"
32
32
  require "will_paginate/collection"
33
33
  require "mongo"
34
- require "mongoid/associations/association_factory"
35
- require "mongoid/associations/belongs_to_association"
36
- require "mongoid/associations/has_many_association"
37
- require "mongoid/associations/has_one_association"
38
- require "mongoid/extensions/array/conversions"
39
- require "mongoid/extensions/object/conversions"
34
+ require "mongoid/associations"
40
35
  require "mongoid/extensions"
41
- require "mongoid/finders"
42
36
  require "mongoid/document"
43
37
 
44
38
  module Mongoid
@@ -0,0 +1,5 @@
1
+ require "mongoid/associations/decorator"
2
+ require "mongoid/associations/factory"
3
+ require "mongoid/associations/belongs_to_association"
4
+ require "mongoid/associations/has_many_association"
5
+ require "mongoid/associations/has_one_association"
@@ -1,6 +1,7 @@
1
1
  module Mongoid #:nodoc:
2
2
  module Associations #:nodoc:
3
3
  class BelongsToAssociation #:nodoc:
4
+ include Decorator
4
5
 
5
6
  # Creates the new association by setting the internal
6
7
  # document as the passed in Document. This should be the
@@ -10,12 +11,14 @@ module Mongoid #:nodoc:
10
11
  # to the internal document itself.
11
12
  def initialize(document)
12
13
  @document = document.parent
14
+ decorate!
13
15
  end
14
16
 
15
- # All calls to this association will be delegated straight
16
- # to the encapsulated document.
17
- def method_missing(method, *args)
18
- @document.send(method, *args)
17
+ # Returns the parent document. The id param is present for
18
+ # compatibility with rails, however this could be overwritten
19
+ # in the future.
20
+ def find(id)
21
+ @document
19
22
  end
20
23
 
21
24
  end
@@ -0,0 +1,25 @@
1
+ module Mongoid #:nodoc:
2
+ module Associations #:nodoc:
3
+ module Decorator #:nodoc:
4
+ def self.included(base)
5
+ base.class_eval do
6
+ attr_reader :document
7
+
8
+ # Grabs all the public methods on the document and adds them
9
+ # to the association class. This is preferred over method_missing
10
+ # since we can ask the class for its methods and get an
11
+ # accurate list.
12
+ def decorate!
13
+ document.public_methods(false).each do |method|
14
+ (class << self; self; end).class_eval do
15
+ define_method method do |*args|
16
+ document.send method, *args
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,6 +1,6 @@
1
1
  module Mongoid #:nodoc:
2
2
  module Associations #:nodoc:
3
- class AssociationFactory #:nodoc:
3
+ class Factory #:nodoc:
4
4
 
5
5
  # Creates a new association, based on the type provided and
6
6
  # passes the name and document into the newly instantiated
@@ -18,4 +18,4 @@ module Mongoid #:nodoc:
18
18
 
19
19
  end
20
20
  end
21
- end
21
+ end
@@ -31,6 +31,13 @@ module Mongoid #:nodoc:
31
31
  object
32
32
  end
33
33
 
34
+ # Finds a document in this association.
35
+ # If :all is passed, returns all the documents
36
+ # If an id is passed, will return the document for that id.
37
+ def find(param)
38
+ return @documents if param == :all
39
+ return detect { |document| document.id == param }
40
+ end
34
41
  end
35
42
  end
36
43
  end
@@ -1,8 +1,8 @@
1
1
  module Mongoid #:nodoc:
2
2
  module Associations #:nodoc:
3
3
  class HasOneAssociation #:nodoc:
4
+ include Decorator
4
5
 
5
- attr_reader :document
6
6
  delegate :valid?, :to => :document
7
7
 
8
8
  # Creates the new association by finding the attributes in
@@ -19,17 +19,6 @@ module Mongoid #:nodoc:
19
19
  decorate!
20
20
  end
21
21
 
22
- private
23
- def decorate!
24
- @document.public_methods(false).each do |method|
25
- (class << self; self; end).class_eval do
26
- define_method method do |*args|
27
- @document.send method, *args
28
- end
29
- end
30
- end
31
- end
32
-
33
22
  end
34
23
  end
35
24
  end
@@ -2,7 +2,9 @@ module Mongoid #:nodoc:
2
2
  class Document #:nodoc:
3
3
  include ActiveSupport::Callbacks
4
4
  include Validatable
5
- extend Finders
5
+
6
+ AGGREGATE_REDUCE = "function(obj, prev) { prev.count++; }"
7
+ GROUP_BY_REDUCE = "function(obj, prev) { prev.group.push(obj); }"
6
8
 
7
9
  attr_reader :attributes, :parent
8
10
 
@@ -15,6 +17,12 @@ module Mongoid #:nodoc:
15
17
  class << self
16
18
 
17
19
  # Create an association to a parent Document.
20
+ # Get an aggregate count for the supplied group of fields and the
21
+ # selector that is provided.
22
+ def aggregate(fields, selector)
23
+ collection.group(fields, selector, { :count => 0 }, AGGREGATE_REDUCE)
24
+ end
25
+
18
26
  def belongs_to(association_name)
19
27
  add_association(:belongs_to, association_name.to_s.classify, association_name)
20
28
  end
@@ -36,6 +44,31 @@ module Mongoid #:nodoc:
36
44
  collection.drop
37
45
  end
38
46
 
47
+ # Find all Documents in several ways.
48
+ # Model.find(:first, :attribute => "value")
49
+ # Model.find(:all, :attribute => "value")
50
+ def find(*args)
51
+ type, selector = args[0], args[1]
52
+ conditions = selector[:conditions] if selector
53
+ case type
54
+ when :all then find_all(conditions)
55
+ when :first then find_first(conditions)
56
+ else find_first(Mongo::ObjectID.from_string(type.to_s))
57
+ end
58
+ end
59
+
60
+ # Find a single Document given the passed selector, which is a Hash of attributes that
61
+ # must match the Document in the database exactly.
62
+ def find_first(selector = nil)
63
+ new(collection.find_one(selector))
64
+ end
65
+
66
+ # Find all Documents given the passed selector, which is a Hash of attributes that
67
+ # must match the Document in the database exactly.
68
+ def find_all(selector = nil)
69
+ collection.find(selector).collect { |doc| new(doc) }
70
+ end
71
+
39
72
  # Defines all the fields that are accessable on the Document
40
73
  # For each field that is defined, a getter and setter will be
41
74
  # added as an instance method to the Document.
@@ -48,6 +81,14 @@ module Mongoid #:nodoc:
48
81
  end
49
82
  end
50
83
 
84
+ # Find all Documents given the supplied criteria, grouped by the fields
85
+ # provided.
86
+ def group_by(fields, selector)
87
+ collection.group(fields, selector, { :group => [] }, GROUP_BY_REDUCE).collect do |docs|
88
+ docs["group"] = docs["group"].collect { |attrs| new(attrs) }; docs
89
+ end
90
+ end
91
+
51
92
  # Create a one-to-many association between Documents.
52
93
  def has_many(association_name)
53
94
  add_association(:has_many, association_name.to_s.classify, association_name)
@@ -73,6 +114,19 @@ module Mongoid #:nodoc:
73
114
  collection.create_index(name, options)
74
115
  end
75
116
 
117
+ # Find all documents in paginated fashion given the supplied arguments.
118
+ # If no parameters are passed just default to offset 0 and limit 20.
119
+ def paginate(params = {})
120
+ WillPaginate::Collection.create(
121
+ params[:page] || 1,
122
+ params[:per_page] || 20,
123
+ 0) do |pager|
124
+ results = collection.find(params[:conditions], { :limit => pager.per_page, :offset => pager.offset })
125
+ pager.total_entries = results.count
126
+ pager.replace(results.collect { |doc| new(doc) })
127
+ end
128
+ end
129
+
76
130
  end
77
131
 
78
132
  # Get the Mongo::Collection associated with this Document.
@@ -148,7 +202,7 @@ module Mongoid #:nodoc:
148
202
  # then adds the accessors for the association.
149
203
  def add_association(type, class_name, name)
150
204
  define_method(name) do
151
- Mongoid::Associations::AssociationFactory.create(type, name, self)
205
+ Mongoid::Associations::Factory.create(type, name, self)
152
206
  end
153
207
  define_method("#{name}=") do |object|
154
208
  @attributes[name] = object.mongoidize
@@ -1,3 +1,6 @@
1
+ require "mongoid/extensions/array/conversions"
2
+ require "mongoid/extensions/object/conversions"
3
+
1
4
  class Array #:nodoc:
2
5
  include Mongoid::Extensions::Array::Conversions
3
6
  end
@@ -5,44 +5,44 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mongoid}
8
- s.version = "0.2.7"
8
+ s.version = "0.3.0"
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-10-01}
12
+ s.date = %q{2009-10-03}
13
13
  s.email = %q{durran@gmail.com}
14
14
  s.extra_rdoc_files = [
15
15
  "README.textile"
16
16
  ]
17
17
  s.files = [
18
18
  ".gitignore",
19
- "History.txt",
20
19
  "MIT_LICENSE",
21
20
  "README.textile",
22
21
  "Rakefile",
23
22
  "VERSION",
24
23
  "lib/mongoid.rb",
25
- "lib/mongoid/associations/association_factory.rb",
24
+ "lib/mongoid/associations.rb",
26
25
  "lib/mongoid/associations/belongs_to_association.rb",
26
+ "lib/mongoid/associations/decorator.rb",
27
+ "lib/mongoid/associations/factory.rb",
27
28
  "lib/mongoid/associations/has_many_association.rb",
28
29
  "lib/mongoid/associations/has_one_association.rb",
29
30
  "lib/mongoid/document.rb",
30
31
  "lib/mongoid/extensions.rb",
31
32
  "lib/mongoid/extensions/array/conversions.rb",
32
33
  "lib/mongoid/extensions/object/conversions.rb",
33
- "lib/mongoid/finders.rb",
34
34
  "mongoid.gemspec",
35
35
  "spec/integration/mongoid/document_spec.rb",
36
36
  "spec/spec.opts",
37
37
  "spec/spec_helper.rb",
38
- "spec/unit/mongoid/associations/association_factory_spec.rb",
39
38
  "spec/unit/mongoid/associations/belongs_to_association_spec.rb",
39
+ "spec/unit/mongoid/associations/decorator_spec.rb",
40
+ "spec/unit/mongoid/associations/factory_spec.rb",
40
41
  "spec/unit/mongoid/associations/has_many_association_spec.rb",
41
42
  "spec/unit/mongoid/associations/has_one_association_spec.rb",
42
43
  "spec/unit/mongoid/document_spec.rb",
43
44
  "spec/unit/mongoid/extensions/array/conversions_spec.rb",
44
- "spec/unit/mongoid/extensions/object/conversions_spec.rb",
45
- "spec/unit/mongoid/finders_spec.rb"
45
+ "spec/unit/mongoid/extensions/object/conversions_spec.rb"
46
46
  ]
47
47
  s.homepage = %q{http://github.com/durran/mongoid}
48
48
  s.rdoc_options = ["--charset=UTF-8"]
@@ -52,14 +52,14 @@ Gem::Specification.new do |s|
52
52
  s.test_files = [
53
53
  "spec/integration/mongoid/document_spec.rb",
54
54
  "spec/spec_helper.rb",
55
- "spec/unit/mongoid/associations/association_factory_spec.rb",
56
55
  "spec/unit/mongoid/associations/belongs_to_association_spec.rb",
56
+ "spec/unit/mongoid/associations/decorator_spec.rb",
57
+ "spec/unit/mongoid/associations/factory_spec.rb",
57
58
  "spec/unit/mongoid/associations/has_many_association_spec.rb",
58
59
  "spec/unit/mongoid/associations/has_one_association_spec.rb",
59
60
  "spec/unit/mongoid/document_spec.rb",
60
61
  "spec/unit/mongoid/extensions/array/conversions_spec.rb",
61
- "spec/unit/mongoid/extensions/object/conversions_spec.rb",
62
- "spec/unit/mongoid/finders_spec.rb"
62
+ "spec/unit/mongoid/extensions/object/conversions_spec.rb"
63
63
  ]
64
64
 
65
65
  if s.respond_to? :specification_version then
@@ -67,13 +67,19 @@ Gem::Specification.new do |s|
67
67
  s.specification_version = 3
68
68
 
69
69
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
70
+ s.add_runtime_dependency(%q<durran-validatable>, [">= 0"])
71
+ s.add_runtime_dependency(%q<mislav-will_paginate>, [">= 0"])
70
72
  s.add_runtime_dependency(%q<activesupport>, [">= 0"])
71
73
  s.add_runtime_dependency(%q<mongodb-mongo>, [">= 0"])
72
74
  else
75
+ s.add_dependency(%q<durran-validatable>, [">= 0"])
76
+ s.add_dependency(%q<mislav-will_paginate>, [">= 0"])
73
77
  s.add_dependency(%q<activesupport>, [">= 0"])
74
78
  s.add_dependency(%q<mongodb-mongo>, [">= 0"])
75
79
  end
76
80
  else
81
+ s.add_dependency(%q<durran-validatable>, [">= 0"])
82
+ s.add_dependency(%q<mislav-will_paginate>, [">= 0"])
77
83
  s.add_dependency(%q<activesupport>, [">= 0"])
78
84
  s.add_dependency(%q<mongodb-mongo>, [">= 0"])
79
85
  end
@@ -43,3 +43,11 @@ end
43
43
  class Tester < Mongoid::Document
44
44
  has_timestamps
45
45
  end
46
+
47
+ class Decorated
48
+ include Mongoid::Associations::Decorator
49
+
50
+ def initialize(doc)
51
+ @document = doc
52
+ end
53
+ end
@@ -7,7 +7,24 @@ describe Mongoid::Associations::BelongsToAssociation do
7
7
  @document = stub(:parent => @parent)
8
8
  end
9
9
 
10
- describe "#method_missing" do
10
+ describe "#find" do
11
+
12
+ before do
13
+ @association = Mongoid::Associations::BelongsToAssociation.new(@document)
14
+ end
15
+
16
+ context "when finding by id" do
17
+
18
+ it "returns the document in the array with that id" do
19
+ name = @association.find(Mongo::ObjectID.new)
20
+ name.should == @parent
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ context "when decorating" do
11
28
 
12
29
  before do
13
30
  @association = Mongoid::Associations::BelongsToAssociation.new(@document)
@@ -0,0 +1,36 @@
1
+ require File.join(File.dirname(__FILE__), "/../../../spec_helper.rb")
2
+
3
+ describe Mongoid::Associations::Decorator do
4
+
5
+ describe "#included" do
6
+
7
+ before do
8
+ @person = Person.new
9
+ @decorated = Decorated.new(@person)
10
+ end
11
+
12
+ it "adds a document reader" do
13
+ @decorated.should respond_to(:document)
14
+ end
15
+
16
+ it "adds a decorate! instance method" do
17
+ @decorated.should respond_to(:decorate!)
18
+ end
19
+
20
+ end
21
+
22
+ describe "#decorate!" do
23
+
24
+ before do
25
+ @person = Person.new
26
+ @decorated = Decorated.new(@person)
27
+ end
28
+
29
+ it "adds all the documents public methods to the class" do
30
+ @decorated.decorate!
31
+ @decorated.should respond_to(:title, :terms, :age, :addresses, :name)
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -1,6 +1,6 @@
1
1
  require File.join(File.dirname(__FILE__), "/../../../spec_helper.rb")
2
2
 
3
- describe Mongoid::Associations::AssociationFactory do
3
+ describe Mongoid::Associations::Factory do
4
4
 
5
5
  describe "#create" do
6
6
 
@@ -11,7 +11,7 @@ describe Mongoid::Associations::AssociationFactory do
11
11
  context "when type is has_many" do
12
12
 
13
13
  it "returns a HasManyAssociationProxy" do
14
- association = Mongoid::Associations::AssociationFactory.create(:has_many, :addresses, @document)
14
+ association = Mongoid::Associations::Factory.create(:has_many, :addresses, @document)
15
15
  association.should be_a_kind_of(Mongoid::Associations::HasManyAssociation)
16
16
  end
17
17
 
@@ -20,7 +20,7 @@ describe Mongoid::Associations::AssociationFactory do
20
20
  context "when type is has_one" do
21
21
 
22
22
  it "returns a HashOneAssociationProxy" do
23
- association = Mongoid::Associations::AssociationFactory.create(:has_one, :name, @document)
23
+ association = Mongoid::Associations::Factory.create(:has_one, :name, @document)
24
24
  association.should be_a_kind_of(Mongoid::Associations::HasOneAssociation)
25
25
  end
26
26
 
@@ -29,7 +29,7 @@ describe Mongoid::Associations::AssociationFactory do
29
29
  context "when type is belongs_to" do
30
30
 
31
31
  it "returns a BelongsToAssociationProxy" do
32
- association = Mongoid::Associations::AssociationFactory.create(:belongs_to, :person, @document)
32
+ association = Mongoid::Associations::Factory.create(:belongs_to, :person, @document)
33
33
  association.should be_a_kind_of(Mongoid::Associations::BelongsToAssociation)
34
34
  end
35
35
 
@@ -37,12 +37,12 @@ describe Mongoid::Associations::AssociationFactory do
37
37
 
38
38
  context "when type is invalid" do
39
39
 
40
- it "should raise a InvalidAssociationError" do
41
- lambda { Mongoid::Associations::AssociationFactory.create(:something, :person, @document) }.should raise_error
40
+ it "raises an InvalidAssociationError" do
41
+ lambda { Mongoid::Associations::Factory.create(:something, :person, @document) }.should raise_error
42
42
  end
43
43
 
44
44
  end
45
45
 
46
46
  end
47
47
 
48
- end
48
+ end
@@ -3,9 +3,11 @@ require File.join(File.dirname(__FILE__), "/../../../spec_helper.rb")
3
3
  describe Mongoid::Associations::HasManyAssociation do
4
4
 
5
5
  before do
6
+ @first_id = Mongo::ObjectID.new
7
+ @second_id = Mongo::ObjectID.new
6
8
  @attributes = { :addresses => [
7
- { :street => "Street 1", :document_class => "Address" },
8
- { :street => "Street 2", :document_class => "Address" } ] }
9
+ { :_id => @first_id, :street => "Street 1", :document_class => "Address" },
10
+ { :_id => @second_id, :street => "Street 2", :document_class => "Address" } ] }
9
11
  @document = stub(:attributes => @attributes)
10
12
  end
11
13
 
@@ -68,6 +70,31 @@ describe Mongoid::Associations::HasManyAssociation do
68
70
 
69
71
  end
70
72
 
73
+ describe "#find" do
74
+
75
+ before do
76
+ @association = Mongoid::Associations::HasManyAssociation.new(:addresses, @document)
77
+ end
78
+
79
+ context "when finding all" do
80
+
81
+ it "returns all the documents" do
82
+ @association.find(:all).should == @association
83
+ end
84
+
85
+ end
86
+
87
+ context "when finding by id" do
88
+
89
+ it "returns the document in the array with that id" do
90
+ address = @association.find(@second_id)
91
+ address.id.should == @second_id
92
+ end
93
+
94
+ end
95
+
96
+ end
97
+
71
98
  describe "#first" do
72
99
 
73
100
  context "when there are elements in the array" do
@@ -14,11 +14,6 @@ describe Mongoid::Document do
14
14
 
15
15
  describe "#belongs_to" do
16
16
 
17
- it "adds a new Association to the collection" do
18
- address = Address.new
19
- address.person.should_not be_nil
20
- end
21
-
22
17
  it "creates a reader for the association" do
23
18
  address = Address.new
24
19
  address.should respond_to(:person)
@@ -107,6 +102,122 @@ describe Mongoid::Document do
107
102
 
108
103
  end
109
104
 
105
+ describe "#find" do
106
+
107
+ before do
108
+ @attributes = { :document_class => "Person" }
109
+ end
110
+
111
+ context "when an id is passed in" do
112
+
113
+ before do
114
+ @id = Mongo::ObjectID.new
115
+ end
116
+
117
+ it "delegates to find_first" do
118
+ @collection.expects(:find_one).with(Mongo::ObjectID.from_string(@id.to_s)).returns(@attributes)
119
+ Person.find(@id.to_s)
120
+ end
121
+
122
+ end
123
+
124
+ context "when finding first" do
125
+
126
+ it "delegates to find_first" do
127
+ @collection.expects(:find_one).with(:test => "Test" ).returns(@attributes)
128
+ Person.find(:first, :conditions => { :test => "Test" })
129
+ end
130
+
131
+ end
132
+
133
+ context "when finding all" do
134
+
135
+ before do
136
+ @cursor = mock
137
+ @people = []
138
+ end
139
+
140
+ it "delegates to find_all" do
141
+ @collection.expects(:find).with(:test => "Test").returns(@cursor)
142
+ @cursor.expects(:collect).returns(@people)
143
+ Person.find(:all, :conditions => { :test => "Test" })
144
+ end
145
+
146
+ end
147
+
148
+ end
149
+
150
+ describe "#find_first" do
151
+
152
+ before do
153
+ @attributes = { :document_class => "Person" }
154
+ end
155
+
156
+ context "when a selector is provided" do
157
+
158
+ it "finds the first document from the collection and instantiates it" do
159
+ @collection.expects(:find_one).with(:test => "Test").returns(@attributes)
160
+ Person.find_first(:test => "Test").attributes.should == @attributes
161
+ end
162
+
163
+ end
164
+
165
+ context "when a selector is not provided" do
166
+
167
+ it "finds the first document from the collection and instantiates it" do
168
+ @collection.expects(:find_one).with(nil).returns(@attributes)
169
+ Person.find_first.attributes.should == @attributes
170
+ end
171
+
172
+ end
173
+
174
+ end
175
+
176
+ describe "#find_all" do
177
+
178
+ before do
179
+ @cursor = mock
180
+ @people = []
181
+ end
182
+
183
+ context "when a selector is provided" do
184
+
185
+ it "finds from the collection and instantiate objects for each returned" do
186
+ @collection.expects(:find).with(:test => "Test").returns(@cursor)
187
+ @cursor.expects(:collect).returns(@people)
188
+ Person.find_all(:test => "Test")
189
+ end
190
+
191
+ end
192
+
193
+ context "when a selector is not provided" do
194
+
195
+ it "finds from the collection and instantiate objects for each returned" do
196
+ @collection.expects(:find).with(nil).returns(@cursor)
197
+ @cursor.expects(:collect).returns(@people)
198
+ Person.find_all
199
+ end
200
+
201
+ end
202
+
203
+ end
204
+
205
+ describe "#group_by" do
206
+
207
+ before do
208
+ @reduce = "function(obj, prev) { prev.group.push(obj); }"
209
+ end
210
+
211
+ it "returns documents grouped by the supplied fields" do
212
+ results = [{ "title" => "Sir", "group" => [{ "title" => "Sir", "age" => 30 }] }]
213
+ @collection.expects(:group).with([:title], {}, { :group => [] }, @reduce).returns(results)
214
+ grouped = Person.group_by([:title], {})
215
+ people = grouped.first["group"]
216
+ people.first.should be_a_kind_of(Person)
217
+ end
218
+
219
+ end
220
+
110
221
  describe "#has_many" do
111
222
 
112
223
  it "adds a new Association to the collection" do
@@ -270,6 +381,32 @@ describe Mongoid::Document do
270
381
 
271
382
  end
272
383
 
384
+ describe "#paginate" do
385
+
386
+ before do
387
+ @cursor = stub(:count => 100, :collect => [])
388
+ end
389
+
390
+ context "when pagination parameters are passed" do
391
+
392
+ it "delegates to will paginate with the results" do
393
+ @collection.expects(:find).with({ :test => "Test" }, {:limit => 20, :offset => 20}).returns(@cursor)
394
+ Person.paginate(:conditions => { :test => "Test" }, :page => 2, :per_page => 20)
395
+ end
396
+
397
+ end
398
+
399
+ context "when pagination parameters are not passed" do
400
+
401
+ it "delegates to will paginate with default values" do
402
+ @collection.expects(:find).with({ :test => "Test" }, {:limit => 20, :offset => 0}).returns(@cursor)
403
+ Person.paginate(:conditions => { :test => "Test" })
404
+ end
405
+
406
+ end
407
+
408
+ end
409
+
273
410
  describe "#parent" do
274
411
 
275
412
  before 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.2.7
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Durran Jordan
@@ -9,9 +9,29 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-01 00:00:00 -04:00
12
+ date: 2009-10-03 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: durran-validatable
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: mislav-will_paginate
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
15
35
  - !ruby/object:Gem::Dependency
16
36
  name: activesupport
17
37
  type: :runtime
@@ -42,33 +62,33 @@ extra_rdoc_files:
42
62
  - README.textile
43
63
  files:
44
64
  - .gitignore
45
- - History.txt
46
65
  - MIT_LICENSE
47
66
  - README.textile
48
67
  - Rakefile
49
68
  - VERSION
50
69
  - lib/mongoid.rb
51
- - lib/mongoid/associations/association_factory.rb
70
+ - lib/mongoid/associations.rb
52
71
  - lib/mongoid/associations/belongs_to_association.rb
72
+ - lib/mongoid/associations/decorator.rb
73
+ - lib/mongoid/associations/factory.rb
53
74
  - lib/mongoid/associations/has_many_association.rb
54
75
  - lib/mongoid/associations/has_one_association.rb
55
76
  - lib/mongoid/document.rb
56
77
  - lib/mongoid/extensions.rb
57
78
  - lib/mongoid/extensions/array/conversions.rb
58
79
  - lib/mongoid/extensions/object/conversions.rb
59
- - lib/mongoid/finders.rb
60
80
  - mongoid.gemspec
61
81
  - spec/integration/mongoid/document_spec.rb
62
82
  - spec/spec.opts
63
83
  - spec/spec_helper.rb
64
- - spec/unit/mongoid/associations/association_factory_spec.rb
65
84
  - spec/unit/mongoid/associations/belongs_to_association_spec.rb
85
+ - spec/unit/mongoid/associations/decorator_spec.rb
86
+ - spec/unit/mongoid/associations/factory_spec.rb
66
87
  - spec/unit/mongoid/associations/has_many_association_spec.rb
67
88
  - spec/unit/mongoid/associations/has_one_association_spec.rb
68
89
  - spec/unit/mongoid/document_spec.rb
69
90
  - spec/unit/mongoid/extensions/array/conversions_spec.rb
70
91
  - spec/unit/mongoid/extensions/object/conversions_spec.rb
71
- - spec/unit/mongoid/finders_spec.rb
72
92
  has_rdoc: true
73
93
  homepage: http://github.com/durran/mongoid
74
94
  licenses: []
@@ -100,11 +120,11 @@ summary: Mongoid
100
120
  test_files:
101
121
  - spec/integration/mongoid/document_spec.rb
102
122
  - spec/spec_helper.rb
103
- - spec/unit/mongoid/associations/association_factory_spec.rb
104
123
  - spec/unit/mongoid/associations/belongs_to_association_spec.rb
124
+ - spec/unit/mongoid/associations/decorator_spec.rb
125
+ - spec/unit/mongoid/associations/factory_spec.rb
105
126
  - spec/unit/mongoid/associations/has_many_association_spec.rb
106
127
  - spec/unit/mongoid/associations/has_one_association_spec.rb
107
128
  - spec/unit/mongoid/document_spec.rb
108
129
  - spec/unit/mongoid/extensions/array/conversions_spec.rb
109
130
  - spec/unit/mongoid/extensions/object/conversions_spec.rb
110
- - spec/unit/mongoid/finders_spec.rb
@@ -1,10 +0,0 @@
1
- 0.2.7:
2
- - Added has_timestamps macro
3
-
4
- 0.2.6:
5
- - Adding destroy_all to document
6
- - Adding before and after create callbacks
7
- - Document#paginate now only takes a single hash as an argument
8
-
9
- 0.2.5:
10
- - Switching pagination over to will_paginate
@@ -1,60 +0,0 @@
1
- module Mongoid #:nodoc:
2
- module Finders #:nodoc:
3
-
4
- AGGREGATE_REDUCE = "function(obj, prev) { prev.count++; }"
5
- GROUP_BY_REDUCE = "function(obj, prev) { prev.group.push(obj); }"
6
-
7
- # Get an aggregate count for the supplied group of fields and the
8
- # selector that is provided.
9
- def aggregate(fields, selector)
10
- collection.group(fields, selector, { :count => 0 }, AGGREGATE_REDUCE)
11
- end
12
-
13
- # Find all Documents in several ways.
14
- # Model.find(:first, :attribute => "value")
15
- # Model.find(:all, :attribute => "value")
16
- def find(*args)
17
- type, selector = args[0], args[1]
18
- conditions = selector[:conditions] if selector
19
- case type
20
- when :all then find_all(conditions)
21
- when :first then find_first(conditions)
22
- else find_first(Mongo::ObjectID.from_string(type.to_s))
23
- end
24
- end
25
-
26
- # Find a single Document given the passed selector, which is a Hash of attributes that
27
- # must match the Document in the database exactly.
28
- def find_first(selector = nil)
29
- new(collection.find_one(selector))
30
- end
31
-
32
- # Find all Documents given the passed selector, which is a Hash of attributes that
33
- # must match the Document in the database exactly.
34
- def find_all(selector = nil)
35
- collection.find(selector).collect { |doc| new(doc) }
36
- end
37
-
38
- # Find all Documents given the supplied criteria, grouped by the fields
39
- # provided.
40
- def group_by(fields, selector)
41
- collection.group(fields, selector, { :group => [] }, GROUP_BY_REDUCE).collect do |docs|
42
- docs["group"] = docs["group"].collect { |attrs| new(attrs) }; docs
43
- end
44
- end
45
-
46
- # Find all documents in paginated fashion given the supplied arguments.
47
- # If no parameters are passed just default to offset 0 and limit 20.
48
- def paginate(params = {})
49
- WillPaginate::Collection.create(
50
- params[:page] || 1,
51
- params[:per_page] || 20,
52
- 0) do |pager|
53
- results = collection.find(params[:conditions], { :limit => pager.per_page, :offset => pager.offset })
54
- pager.total_entries = results.count
55
- pager.replace(results.collect { |doc| new(doc) })
56
- end
57
- end
58
-
59
- end
60
- end
@@ -1,165 +0,0 @@
1
- require File.join(File.dirname(__FILE__), "/../../spec_helper.rb")
2
-
3
- describe Mongoid::Finders do
4
-
5
- before do
6
- @collection = mock
7
- @database = stub(:collection => @collection)
8
- Mongoid.stubs(:database).returns(@database)
9
- end
10
-
11
- after do
12
- Person.instance_variable_set(:@collection, nil)
13
- end
14
-
15
- describe "#find" do
16
-
17
- before do
18
- @attributes = { :document_class => "Person" }
19
- end
20
-
21
- context "when an id is passed in" do
22
-
23
- before do
24
- @id = Mongo::ObjectID.new
25
- end
26
-
27
- it "delegates to find_first" do
28
- @collection.expects(:find_one).with(Mongo::ObjectID.from_string(@id.to_s)).returns(@attributes)
29
- Person.find(@id.to_s)
30
- end
31
-
32
- end
33
-
34
- context "when finding first" do
35
-
36
- it "delegates to find_first" do
37
- @collection.expects(:find_one).with(:test => "Test" ).returns(@attributes)
38
- Person.find(:first, :conditions => { :test => "Test" })
39
- end
40
-
41
- end
42
-
43
- context "when finding all" do
44
-
45
- before do
46
- @cursor = mock
47
- @people = []
48
- end
49
-
50
- it "delegates to find_all" do
51
- @collection.expects(:find).with(:test => "Test").returns(@cursor)
52
- @cursor.expects(:collect).returns(@people)
53
- Person.find(:all, :conditions => { :test => "Test" })
54
- end
55
-
56
- end
57
-
58
- end
59
-
60
- describe "#find_first" do
61
-
62
- before do
63
- @attributes = { :document_class => "Person" }
64
- end
65
-
66
- context "when a selector is provided" do
67
-
68
- it "finds the first document from the collection and instantiates it" do
69
- @collection.expects(:find_one).with(:test => "Test").returns(@attributes)
70
- Person.find_first(:test => "Test").attributes.should == @attributes
71
- end
72
-
73
- end
74
-
75
- context "when a selector is not provided" do
76
-
77
- it "finds the first document from the collection and instantiates it" do
78
- @collection.expects(:find_one).with(nil).returns(@attributes)
79
- Person.find_first.attributes.should == @attributes
80
- end
81
-
82
- end
83
-
84
- end
85
-
86
- describe "#find_all" do
87
-
88
- before do
89
- @cursor = mock
90
- @people = []
91
- end
92
-
93
- context "when a selector is provided" do
94
-
95
- it "finds from the collection and instantiate objects for each returned" do
96
- @collection.expects(:find).with(:test => "Test").returns(@cursor)
97
- @cursor.expects(:collect).returns(@people)
98
- Person.find_all(:test => "Test")
99
- end
100
-
101
- end
102
-
103
- context "when a selector is not provided" do
104
-
105
- it "finds from the collection and instantiate objects for each returned" do
106
- @collection.expects(:find).with(nil).returns(@cursor)
107
- @cursor.expects(:collect).returns(@people)
108
- Person.find_all
109
- end
110
-
111
- end
112
-
113
- end
114
-
115
- describe "#group_by" do
116
-
117
- before do
118
- @reduce = "function(obj, prev) { prev.group.push(obj); }"
119
- end
120
-
121
- it "returns documents grouped by the supplied fields" do
122
- results = [{ "title" => "Sir", "group" => [{ "title" => "Sir", "age" => 30 }] }]
123
- @collection.expects(:group).with([:title], {}, { :group => [] }, @reduce).returns(results)
124
- grouped = Person.group_by([:title], {})
125
- people = grouped.first["group"]
126
- people.first.should be_a_kind_of(Person)
127
- end
128
-
129
- end
130
-
131
- describe "#paginate" do
132
-
133
- before do
134
- @cursor = stub(:count => 100, :collect => [])
135
- end
136
-
137
- context "when pagination parameters are passed" do
138
-
139
- it "delegates to will paginate with the results" do
140
- @collection.expects(:find).with({ :test => "Test" }, {:limit => 20, :offset => 20}).returns(@cursor)
141
- Person.paginate(:conditions => { :test => "Test" }, :page => 2, :per_page => 20)
142
- end
143
-
144
- end
145
-
146
- context "when pagination parameters are not passed" do
147
-
148
- it "delegates to will paginate with default values" do
149
- @collection.expects(:find).with({ :test => "Test" }, {:limit => 20, :offset => 0}).returns(@cursor)
150
- Person.paginate(:conditions => { :test => "Test" })
151
- end
152
-
153
- end
154
-
155
- context "when param keys are strings" do
156
-
157
- it "converts the keys to symbols" do
158
-
159
- end
160
-
161
- end
162
-
163
- end
164
-
165
- end