mongomodel 0.2.15 → 0.2.16
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/Gemfile +1 -1
- data/lib/mongomodel/concerns/attribute_methods/dirty.rb +1 -1
- data/lib/mongomodel/document.rb +4 -0
- data/lib/mongomodel/document/scopes.rb +1 -1
- data/lib/mongomodel/support/scope.rb +3 -2
- data/lib/mongomodel/support/scope/pagination.rb +17 -0
- data/lib/mongomodel/version.rb +1 -1
- data/mongomodel.gemspec +1 -0
- data/spec/mongomodel/concerns/attribute_methods/dirty_spec.rb +1 -1
- data/spec/mongomodel/mongomodel_spec.rb +2 -2
- data/spec/mongomodel/support/scope_spec.rb +47 -0
- metadata +27 -10
data/Gemfile
CHANGED
@@ -12,7 +12,7 @@ module MongoModel
|
|
12
12
|
|
13
13
|
# Returns the attributes as they were before any changes were made to the document.
|
14
14
|
def original_attributes
|
15
|
-
{}.merge(attributes).merge(changed_attributes)
|
15
|
+
{}.with_indifferent_access.merge(attributes).merge(changed_attributes)
|
16
16
|
end
|
17
17
|
|
18
18
|
protected
|
data/lib/mongomodel/document.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'active_support/core_ext/class/attribute_accessors'
|
1
2
|
require 'active_support/core_ext/hash/reverse_merge'
|
2
3
|
require 'active_support/core_ext/hash/deep_merge'
|
3
4
|
require 'active_support/core_ext/string/inflections'
|
@@ -15,5 +16,8 @@ module MongoModel
|
|
15
16
|
include DocumentExtensions::Callbacks
|
16
17
|
|
17
18
|
self.abstract_class = true
|
19
|
+
|
20
|
+
cattr_accessor :per_page
|
21
|
+
self.per_page = 20
|
18
22
|
end
|
19
23
|
end
|
@@ -13,7 +13,7 @@ module MongoModel
|
|
13
13
|
module ClassMethods
|
14
14
|
delegate :find, :first, :last, :all, :exists?, :count, :to => :scoped
|
15
15
|
delegate :update, :update_all, :delete, :delete_all, :destroy, :destroy_all, :to => :scoped
|
16
|
-
delegate :select, :order, :where, :limit, :offset, :from, :to => :scoped
|
16
|
+
delegate :select, :order, :where, :limit, :offset, :from, :paginate, :to => :scoped
|
17
17
|
|
18
18
|
def unscoped
|
19
19
|
@unscoped ||= MongoModel::Scope.new(self)
|
@@ -9,10 +9,11 @@ module MongoModel
|
|
9
9
|
autoload :QueryMethods, 'mongomodel/support/scope/query_methods'
|
10
10
|
autoload :FinderMethods, 'mongomodel/support/scope/finder_methods'
|
11
11
|
autoload :DynamicFinders, 'mongomodel/support/scope/dynamic_finders'
|
12
|
+
autoload :Pagination, 'mongomodel/support/scope/pagination'
|
12
13
|
|
13
|
-
include DynamicFinders, FinderMethods, QueryMethods, SpawnMethods
|
14
|
+
include Pagination, DynamicFinders, FinderMethods, QueryMethods, SpawnMethods
|
14
15
|
|
15
|
-
delegate :inspect, :to => :to_a
|
16
|
+
delegate :inspect, :as_json, :to => :to_a
|
16
17
|
|
17
18
|
attr_reader :klass
|
18
19
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'will_paginate/collection'
|
2
|
+
|
3
|
+
module MongoModel
|
4
|
+
class Scope
|
5
|
+
module Pagination
|
6
|
+
def paginate(options={})
|
7
|
+
page = options[:page] || 1
|
8
|
+
per_page = options[:per_page] || klass.per_page
|
9
|
+
|
10
|
+
WillPaginate::Collection.create(page, per_page) do |pager|
|
11
|
+
pager.replace offset(pager.offset).limit(pager.per_page)
|
12
|
+
pager.total_entries ||= count
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/mongomodel/version.rb
CHANGED
data/mongomodel.gemspec
CHANGED
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.add_dependency "activesupport", "~> 3.0.3"
|
18
18
|
s.add_dependency "activemodel", "~> 3.0.3"
|
19
19
|
s.add_dependency "mongo", "~> 1.1.2"
|
20
|
+
s.add_dependency "will_paginate", "~> 2.3.15"
|
20
21
|
|
21
22
|
s.add_development_dependency "bundler", ">= 1.0.0"
|
22
23
|
s.add_development_dependency "rspec", "= 1.3.0"
|
@@ -142,7 +142,7 @@ module MongoModel
|
|
142
142
|
|
143
143
|
context "without changes" do
|
144
144
|
it "should return the attributes hash" do
|
145
|
-
subject.original_attributes.should == subject.attributes
|
145
|
+
subject.original_attributes.symbolize_keys.should == subject.attributes
|
146
146
|
end
|
147
147
|
end
|
148
148
|
end
|
@@ -23,8 +23,8 @@ describe MongoModel do
|
|
23
23
|
database = MongoModel.database
|
24
24
|
connection = database.connection
|
25
25
|
|
26
|
-
connection.host.should == '127.0.0.1'
|
27
|
-
connection.port.should == 27017
|
26
|
+
connection.primary_pool.host.should == '127.0.0.1'
|
27
|
+
connection.primary_pool.port.should == 27017
|
28
28
|
database.name.should == 'mydb'
|
29
29
|
end
|
30
30
|
end
|
@@ -57,6 +57,12 @@ module MongoModel
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
+
describe "#as_json" do
|
61
|
+
it "should delegate to #to_a" do
|
62
|
+
subject.as_json.should == subject.to_a.as_json
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
60
66
|
describe "#count" do
|
61
67
|
it "should count documents matching conditions and return the result" do
|
62
68
|
model.should_count(finder_options, 4) do
|
@@ -728,6 +734,47 @@ module MongoModel
|
|
728
734
|
end
|
729
735
|
end
|
730
736
|
end
|
737
|
+
|
738
|
+
describe "#paginate" do
|
739
|
+
it "should load the first page of results by default" do
|
740
|
+
model.should_find(finder_options.merge(:offset => 0, :limit => 20), posts) {
|
741
|
+
subject.paginate
|
742
|
+
}
|
743
|
+
end
|
744
|
+
|
745
|
+
it "should load a specified page of results" do
|
746
|
+
model.should_find(finder_options.merge(:offset => 40, :limit => 20), posts) {
|
747
|
+
subject.paginate(:page => 3)
|
748
|
+
}
|
749
|
+
end
|
750
|
+
|
751
|
+
it "should allow the per_page option to be set" do
|
752
|
+
model.should_find(finder_options.merge(:offset => 7, :limit => 7), posts) {
|
753
|
+
subject.paginate(:per_page => 7, :page => 2)
|
754
|
+
}
|
755
|
+
end
|
756
|
+
|
757
|
+
it "should auto-detect total entries where possible" do
|
758
|
+
paginator = nil
|
759
|
+
|
760
|
+
model.should_find(finder_options.merge(:offset => 0, :limit => 20), posts) {
|
761
|
+
paginator = subject.paginate
|
762
|
+
}
|
763
|
+
|
764
|
+
paginator.total_entries.should == 5
|
765
|
+
end
|
766
|
+
|
767
|
+
it "should load total entries using count when auto-detection not possible" do
|
768
|
+
paginator = nil
|
769
|
+
|
770
|
+
subject.stub!(:count).and_return(57)
|
771
|
+
model.should_find(finder_options.merge(:offset => 0, :limit => 5), posts) {
|
772
|
+
paginator = subject.paginate(:per_page => 5)
|
773
|
+
}
|
774
|
+
|
775
|
+
paginator.total_entries.should == 57
|
776
|
+
end
|
777
|
+
end
|
731
778
|
end
|
732
779
|
|
733
780
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongomodel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 55
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 16
|
10
|
+
version: 0.2.16
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Sam Pohlenz
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-01-04 00:00:00 +10:30
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -67,9 +67,25 @@ dependencies:
|
|
67
67
|
type: :runtime
|
68
68
|
version_requirements: *id003
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: will_paginate
|
71
71
|
prerelease: false
|
72
72
|
requirement: &id004 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 29
|
78
|
+
segments:
|
79
|
+
- 2
|
80
|
+
- 3
|
81
|
+
- 15
|
82
|
+
version: 2.3.15
|
83
|
+
type: :runtime
|
84
|
+
version_requirements: *id004
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: bundler
|
87
|
+
prerelease: false
|
88
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
73
89
|
none: false
|
74
90
|
requirements:
|
75
91
|
- - ">="
|
@@ -81,11 +97,11 @@ dependencies:
|
|
81
97
|
- 0
|
82
98
|
version: 1.0.0
|
83
99
|
type: :development
|
84
|
-
version_requirements: *
|
100
|
+
version_requirements: *id005
|
85
101
|
- !ruby/object:Gem::Dependency
|
86
102
|
name: rspec
|
87
103
|
prerelease: false
|
88
|
-
requirement: &
|
104
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
89
105
|
none: false
|
90
106
|
requirements:
|
91
107
|
- - "="
|
@@ -97,7 +113,7 @@ dependencies:
|
|
97
113
|
- 0
|
98
114
|
version: 1.3.0
|
99
115
|
type: :development
|
100
|
-
version_requirements: *
|
116
|
+
version_requirements: *id006
|
101
117
|
description: MongoModel is a MongoDB ORM for Ruby/Rails similar to ActiveRecord and DataMapper.
|
102
118
|
email:
|
103
119
|
- sam@sampohlenz.com
|
@@ -174,6 +190,7 @@ files:
|
|
174
190
|
- lib/mongomodel/support/scope.rb
|
175
191
|
- lib/mongomodel/support/scope/dynamic_finders.rb
|
176
192
|
- lib/mongomodel/support/scope/finder_methods.rb
|
193
|
+
- lib/mongomodel/support/scope/pagination.rb
|
177
194
|
- lib/mongomodel/support/scope/query_methods.rb
|
178
195
|
- lib/mongomodel/support/scope/spawn_methods.rb
|
179
196
|
- lib/mongomodel/support/types.rb
|
@@ -281,7 +298,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
281
298
|
requirements: []
|
282
299
|
|
283
300
|
rubyforge_project: mongomodel
|
284
|
-
rubygems_version: 1.
|
301
|
+
rubygems_version: 1.4.1
|
285
302
|
signing_key:
|
286
303
|
specification_version: 3
|
287
304
|
summary: MongoDB ORM for Ruby/Rails
|