plucky 0.1.4 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/plucky.rb +5 -0
- data/lib/plucky/criteria_hash.rb +9 -0
- data/lib/plucky/options_hash.rb +12 -0
- data/lib/plucky/pagination/decorator.rb +21 -0
- data/lib/plucky/pagination/paginator.rb +37 -0
- data/lib/plucky/query.rb +54 -22
- data/lib/plucky/version.rb +1 -1
- metadata +5 -4
data/lib/plucky.rb
CHANGED
@@ -9,6 +9,11 @@ module Plucky
|
|
9
9
|
autoload :Query, 'plucky/query'
|
10
10
|
autoload :Version, 'plucky/version'
|
11
11
|
|
12
|
+
module Pagination
|
13
|
+
autoload :Decorator, 'plucky/pagination/decorator'
|
14
|
+
autoload :Paginator, 'plucky/pagination/paginator'
|
15
|
+
end
|
16
|
+
|
12
17
|
def self.to_object_id(value)
|
13
18
|
if value.nil? || (value.respond_to?(:empty?) && value.empty?)
|
14
19
|
nil
|
data/lib/plucky/criteria_hash.rb
CHANGED
@@ -12,6 +12,9 @@ module Plucky
|
|
12
12
|
super
|
13
13
|
@options = @options.dup
|
14
14
|
@source = @source.dup
|
15
|
+
each do |key, value|
|
16
|
+
self[key] = value.dup if value.is_a?(Array) || value.is_a?(Hash)
|
17
|
+
end
|
15
18
|
end
|
16
19
|
|
17
20
|
def []=(key, value)
|
@@ -74,6 +77,12 @@ module Plucky
|
|
74
77
|
self.class.new(target)
|
75
78
|
end
|
76
79
|
|
80
|
+
def merge!(other)
|
81
|
+
merge(other).to_hash.each do |key, value|
|
82
|
+
self[key] = value
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
77
86
|
def object_ids
|
78
87
|
@options[:object_ids] ||= []
|
79
88
|
end
|
data/lib/plucky/options_hash.rb
CHANGED
@@ -11,6 +11,9 @@ module Plucky
|
|
11
11
|
def initialize_copy(source)
|
12
12
|
super
|
13
13
|
@source = @source.dup
|
14
|
+
each do |key, value|
|
15
|
+
self[key] = value.dup if value.is_a?(Array) || value.is_a?(Hash)
|
16
|
+
end
|
14
17
|
end
|
15
18
|
|
16
19
|
def []=(key, value)
|
@@ -30,6 +33,15 @@ module Plucky
|
|
30
33
|
!self[:fields].nil?
|
31
34
|
end
|
32
35
|
|
36
|
+
def merge(other)
|
37
|
+
self.class.new(to_hash.merge(other.to_hash))
|
38
|
+
end
|
39
|
+
|
40
|
+
def merge!(other)
|
41
|
+
other.to_hash.each { |key, value| self[key] = value }
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
33
45
|
private
|
34
46
|
def method_missing(method, *args, &block)
|
35
47
|
@source.send(method, *args, &block)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
module Plucky
|
3
|
+
module Pagination
|
4
|
+
module Decorator
|
5
|
+
extend Forwardable
|
6
|
+
|
7
|
+
def_delegators :@paginator,
|
8
|
+
:total_entries, :total_pages,
|
9
|
+
:current_page, :per_page,
|
10
|
+
:previous_page, :next_page,
|
11
|
+
:skip, :limit,
|
12
|
+
:offset, :out_of_bounds?
|
13
|
+
|
14
|
+
def paginator(p=nil)
|
15
|
+
return @paginator if p.nil?
|
16
|
+
@paginator = p
|
17
|
+
self
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module Plucky
|
3
|
+
module Pagination
|
4
|
+
class Paginator
|
5
|
+
attr_reader :total_entries, :current_page, :per_page
|
6
|
+
|
7
|
+
def initialize(total, page, per_page=nil)
|
8
|
+
@total_entries = total.to_i
|
9
|
+
@current_page = [page.to_i, 1].max
|
10
|
+
@per_page = (per_page || 25).to_i
|
11
|
+
end
|
12
|
+
|
13
|
+
def total_pages
|
14
|
+
(total_entries / per_page.to_f).ceil
|
15
|
+
end
|
16
|
+
|
17
|
+
def out_of_bounds?
|
18
|
+
current_page > total_pages
|
19
|
+
end
|
20
|
+
|
21
|
+
def previous_page
|
22
|
+
current_page > 1 ? (current_page - 1) : nil
|
23
|
+
end
|
24
|
+
|
25
|
+
def next_page
|
26
|
+
current_page < total_pages ? (current_page + 1) : nil
|
27
|
+
end
|
28
|
+
|
29
|
+
def skip
|
30
|
+
(current_page - 1) * per_page
|
31
|
+
end
|
32
|
+
|
33
|
+
alias :limit :per_page
|
34
|
+
alias :offset :skip
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/plucky/query.rb
CHANGED
@@ -30,32 +30,63 @@ module Plucky
|
|
30
30
|
self
|
31
31
|
end
|
32
32
|
|
33
|
-
def
|
34
|
-
|
33
|
+
def per_page(limit=nil)
|
34
|
+
return @per_page || 25 if limit.nil?
|
35
|
+
@per_page = limit
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
def paginate(opts={})
|
40
|
+
page = opts.delete(:page)
|
41
|
+
limit = opts.delete(:per_page) || per_page
|
42
|
+
query = clone.update(opts)
|
43
|
+
total = query.count
|
44
|
+
paginator = Pagination::Paginator.new(total, page, limit)
|
45
|
+
query[:limit] = paginator.limit
|
46
|
+
query[:skip] = paginator.skip
|
47
|
+
query.all.tap do |docs|
|
48
|
+
docs.extend(Pagination::Decorator)
|
49
|
+
docs.paginator(paginator)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def find_many(opts={})
|
54
|
+
query = clone.update(opts)
|
55
|
+
query.collection.find(query.criteria.to_hash, query.options.to_hash)
|
35
56
|
end
|
36
57
|
|
37
58
|
def find_one(opts={})
|
38
|
-
update(opts)
|
59
|
+
query = clone.update(opts)
|
60
|
+
query.collection.find_one(query.criteria.to_hash, query.options.to_hash)
|
61
|
+
end
|
62
|
+
|
63
|
+
def find(*ids)
|
64
|
+
if ids.size == 1 && !ids[0].is_a?(Array)
|
65
|
+
first(:_id => ids[0])
|
66
|
+
else
|
67
|
+
all(:_id => ids.flatten)
|
68
|
+
end
|
39
69
|
end
|
40
70
|
|
41
71
|
def all(opts={})
|
42
|
-
|
72
|
+
find_many(opts).to_a
|
43
73
|
end
|
44
74
|
|
45
75
|
def first(opts={})
|
46
|
-
|
76
|
+
find_one(opts)
|
47
77
|
end
|
48
78
|
|
49
79
|
def last(opts={})
|
50
|
-
update(opts).reverse.find_one
|
80
|
+
clone.update(opts).reverse.find_one
|
51
81
|
end
|
52
82
|
|
53
83
|
def remove(opts={})
|
54
|
-
update(opts)
|
84
|
+
query = clone.update(opts)
|
85
|
+
query.collection.remove(query.criteria.to_hash)
|
55
86
|
end
|
56
87
|
|
57
88
|
def count(opts={})
|
58
|
-
|
89
|
+
find_many(opts).count
|
59
90
|
end
|
60
91
|
|
61
92
|
def update(opts={})
|
@@ -64,33 +95,33 @@ module Plucky
|
|
64
95
|
end
|
65
96
|
|
66
97
|
def fields(*args)
|
67
|
-
|
68
|
-
self
|
98
|
+
clone.tap { |query| query.options[:fields] = args }
|
69
99
|
end
|
70
100
|
|
71
101
|
def limit(count=nil)
|
72
|
-
|
73
|
-
self
|
102
|
+
clone.tap { |query| query.options[:limit] = count }
|
74
103
|
end
|
75
104
|
|
76
105
|
def reverse
|
77
|
-
|
78
|
-
|
106
|
+
clone.tap do |query|
|
107
|
+
query[:sort].map! do |s|
|
108
|
+
[s[0], -s[1]]
|
109
|
+
end unless query.options[:sort].nil?
|
110
|
+
end
|
79
111
|
end
|
80
112
|
|
81
113
|
def skip(count=nil)
|
82
|
-
|
83
|
-
self
|
114
|
+
clone.tap { |query| query.options[:skip] = count }
|
84
115
|
end
|
85
116
|
|
86
117
|
def sort(*args)
|
87
|
-
|
88
|
-
self
|
118
|
+
clone.tap { |query| query.options[:sort] = *args }
|
89
119
|
end
|
90
120
|
|
91
121
|
def where(hash={})
|
92
|
-
|
93
|
-
|
122
|
+
clone.tap do |query|
|
123
|
+
query.criteria.merge!(CriteriaHash.new(hash))
|
124
|
+
end
|
94
125
|
end
|
95
126
|
|
96
127
|
def [](key)
|
@@ -112,8 +143,9 @@ module Plucky
|
|
112
143
|
end
|
113
144
|
|
114
145
|
def merge(other)
|
115
|
-
|
116
|
-
|
146
|
+
merged_criteria = criteria.merge(other.criteria).to_hash
|
147
|
+
merged_options = options.merge(other.options).to_hash
|
148
|
+
clone.update(merged_criteria).update(merged_options)
|
117
149
|
end
|
118
150
|
|
119
151
|
def to_hash
|
data/lib/plucky/version.rb
CHANGED
metadata
CHANGED
@@ -4,9 +4,8 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
|
9
|
-
version: 0.1.4
|
7
|
+
- 2
|
8
|
+
version: "0.2"
|
10
9
|
platform: ruby
|
11
10
|
authors:
|
12
11
|
- John Nunemaker
|
@@ -14,7 +13,7 @@ autorequire:
|
|
14
13
|
bindir: bin
|
15
14
|
cert_chain: []
|
16
15
|
|
17
|
-
date: 2010-05-
|
16
|
+
date: 2010-05-30 00:00:00 -04:00
|
18
17
|
default_executable:
|
19
18
|
dependencies:
|
20
19
|
- !ruby/object:Gem::Dependency
|
@@ -86,6 +85,8 @@ files:
|
|
86
85
|
- lib/plucky/criteria_hash.rb
|
87
86
|
- lib/plucky/extensions.rb
|
88
87
|
- lib/plucky/options_hash.rb
|
88
|
+
- lib/plucky/pagination/decorator.rb
|
89
|
+
- lib/plucky/pagination/paginator.rb
|
89
90
|
- lib/plucky/query.rb
|
90
91
|
- lib/plucky/version.rb
|
91
92
|
- lib/plucky.rb
|