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 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
@@ -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
@@ -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 find(opts={})
34
- update(opts).collection.find(criteria.to_hash, options.to_hash)
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).collection.find_one(criteria.to_hash, options.to_hash)
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
- update(opts).find(to_hash).to_a
72
+ find_many(opts).to_a
43
73
  end
44
74
 
45
75
  def first(opts={})
46
- update(opts).find_one(to_hash)
76
+ find_one(opts)
47
77
  end
48
78
 
49
79
  def last(opts={})
50
- update(opts).reverse.find_one(to_hash)
80
+ clone.update(opts).reverse.find_one
51
81
  end
52
82
 
53
83
  def remove(opts={})
54
- update(opts).collection.remove(criteria.to_hash)
84
+ query = clone.update(opts)
85
+ query.collection.remove(query.criteria.to_hash)
55
86
  end
56
87
 
57
88
  def count(opts={})
58
- update(opts).find(to_hash).count
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
- self[:fields] = args
68
- self
98
+ clone.tap { |query| query.options[:fields] = args }
69
99
  end
70
100
 
71
101
  def limit(count=nil)
72
- self[:limit] = count
73
- self
102
+ clone.tap { |query| query.options[:limit] = count }
74
103
  end
75
104
 
76
105
  def reverse
77
- self[:sort].map! { |s| [s[0], -s[1]] } unless self[:sort].nil?
78
- self
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
- self[:skip] = count
83
- self
114
+ clone.tap { |query| query.options[:skip] = count }
84
115
  end
85
116
 
86
117
  def sort(*args)
87
- self[:sort] = *args
88
- self
118
+ clone.tap { |query| query.options[:sort] = *args }
89
119
  end
90
120
 
91
121
  def where(hash={})
92
- criteria.merge(CriteriaHash.new(hash)).to_hash.each { |key, value| self[key] = value }
93
- self
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
- merged = criteria.merge(other.criteria).to_hash.merge(options.to_hash.merge(other.options.to_hash))
116
- clone.update(merged)
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
@@ -1,4 +1,4 @@
1
1
  # encoding: UTF-8
2
2
  module Plucky
3
- Version = '0.1.4'
3
+ Version = '0.2'
4
4
  end
metadata CHANGED
@@ -4,9 +4,8 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
8
- - 4
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-25 00:00:00 -04:00
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