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 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