plucky 0.1.4 → 0.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/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
|