filterer 0.0.3 → 0.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fed029c0db1f3a900c0af648704587166c5d4f6d
4
- data.tar.gz: 6576fd8e1596594e5af46270d1bf9403b5ca34c0
3
+ metadata.gz: 7734d274d4ea4be3fa564c0d94a0b1a6fbb0910f
4
+ data.tar.gz: 09622d7c585ed55a808810ac358a1a052b5f4da5
5
5
  SHA512:
6
- metadata.gz: b5e9b5c05cbb35451391cb5ced7f1e74537399a46fee94f56a7948fd966bf4dad7c9c69712cec25d77a722f7405fff9289a6d427be725f5c6e1a5279ff1478a6
7
- data.tar.gz: 894a79cbddf677f8a2ac3ba0ce98a9537a07d5bf3cbfe22899dc99f0d2b95be3f744d79a2b0f2e04f2419ac185701711b0c7c35897047a3dcea3e799cf74fd09
6
+ metadata.gz: ba86f46c95b642b8606fdc5aac56e895c5dc5b4a4920f0be1bcb93a1eecf3b064836518b90e45c8657929819010b29bba5152ac605dbbc963231688b203ad6d4
7
+ data.tar.gz: 928079d0abddddf7a0c6b15a781332bc0bb52935190df90226852a2b417eeb9cd1f0d7a162d174311ceb41ab5e5850c25276c4e6b8313bace2c4c3347fee6aa0
data/lib/filterer/base.rb CHANGED
@@ -1,9 +1,51 @@
1
1
  module Filterer
2
2
  class Base
3
3
 
4
+ IGNORED_PARAMS = [:page]
5
+
4
6
  attr_accessor :results, :meta, :direction, :sort, :params
5
7
 
6
- IGNORED_PARAMS = [:page]
8
+ class << self
9
+ attr_accessor :sort_options
10
+
11
+ def sort_options
12
+ @sort_options ||= []
13
+ end
14
+
15
+ def inherited(subclass)
16
+ if @sort_options.present?
17
+ subclass.sort_options = @sort_options
18
+ end
19
+ end
20
+
21
+ def sort_option(key, query_string_or_proc = nil, opts = {})
22
+ if query_string_or_proc.is_a?(Hash)
23
+ opts, query_string_or_proc = query_string_or_proc.clone, nil
24
+ end
25
+
26
+ if !query_string_or_proc
27
+ if key.is_a?(String)
28
+ query_string_or_proc = key
29
+ else
30
+ raise 'Please provide a query string or a proc.'
31
+ end
32
+ end
33
+
34
+ if key.is_a?(Regexp) && opts[:default]
35
+ raise "Default sort option can't have a Regexp key."
36
+ end
37
+
38
+ if query_string_or_proc.is_a?(Proc) && opts[:tiebreaker]
39
+ raise "Tiebreaker can't be a proc."
40
+ end
41
+
42
+ sort_options << {
43
+ key: key,
44
+ query_string_or_proc: query_string_or_proc,
45
+ opts: opts
46
+ }
47
+ end
48
+ end
7
49
 
8
50
  def initialize(params = {}, opts = {})
9
51
  @params, @opts = params, opts
@@ -54,9 +96,46 @@ module Filterer
54
96
  end
55
97
 
56
98
  def order_results
57
- # noop
99
+ @direction = @params[:direction] == 'desc' ? 'DESC' : 'ASC'
100
+ @sort = (params[:sort] && get_sort_option(params[:sort])) ? params[:sort] : default_sort_param
101
+ return unless get_sort_option(@sort)
102
+
103
+ if get_sort_option(@sort)[:query_string_or_proc].is_a?(String)
104
+ @results = @results.order %Q{
105
+ #{get_sort_option(@sort)[:query_string_or_proc]}
106
+ #{@direction}
107
+ #{get_sort_option(@sort)[:opts][:nulls_last] ? 'NULLS LAST' : ''}
108
+ #{tiebreaker_sort_string ? ',' + tiebreaker_sort_string : ''}
109
+ }.squish
110
+ elsif get_sort_option(@sort)[:query_string_or_proc].is_a?(Proc)
111
+ matches = get_sort_option(@sort)[:key].is_a?(Regexp) ? @sort.match(get_sort_option(@sort)[:key]) : nil
112
+ @results = get_sort_option(@sort)[:query_string_or_proc].call(@results, matches)
113
+ end
58
114
  end
59
115
 
116
+ def get_sort_option(x)
117
+ self.class.sort_options.find { |sort_option|
118
+ if sort_option[:key].is_a?(Regexp)
119
+ x.match(sort_option[:key])
120
+ else # String
121
+ x == sort_option[:key]
122
+ end
123
+ }
124
+ end
125
+
126
+ def default_sort_param
127
+ self.class.sort_options.find { |sort_option|
128
+ sort_option[:opts][:default]
129
+ }.try(:[], :key)
130
+ end
131
+
132
+ def tiebreaker_sort_string
133
+ self.class.sort_options.find { |sort_option|
134
+ sort_option[:opts][:tiebreaker]
135
+ }.try(:[], :query_string_or_proc)
136
+ end
137
+
138
+
60
139
  def starting_query
61
140
  raise 'You must override this method!'
62
141
  end
@@ -3,9 +3,9 @@ module Filterer
3
3
 
4
4
  attr_reader :pages
5
5
 
6
- def initialize(searcher)
7
- @searcher = searcher
8
- return @pages = [1] if @searcher.meta[:last_page] == 1
6
+ def initialize(filterer)
7
+ @filterer = filterer
8
+ return @pages = [1] if @filterer.meta[:last_page] == 1
9
9
  push_default_pages
10
10
  calculate_additional_pages
11
11
  add_breaks
@@ -13,14 +13,14 @@ module Filterer
13
13
 
14
14
  def push_default_pages
15
15
  @pages = [1, 2]
16
- push_page(@searcher.meta[:last_page], @searcher.meta[:last_page] - 1)
16
+ push_page(@filterer.meta[:last_page], @filterer.meta[:last_page] - 1)
17
17
  end
18
18
 
19
19
  def calculate_additional_pages
20
20
  offset = 0
21
- current_page = @searcher.meta[:page]
21
+ current_page = @filterer.meta[:page]
22
22
 
23
- while @pages.length < 11 && ( (current_page - offset >= 1) || (current_page + offset <= @searcher.meta[:last_page]) ) do
23
+ while @pages.length < 11 && ( (current_page - offset >= 1) || (current_page + offset <= @filterer.meta[:last_page]) ) do
24
24
  push_page(current_page - offset, current_page + offset)
25
25
  offset += 1
26
26
  end
@@ -43,7 +43,7 @@ module Filterer
43
43
 
44
44
  def push_page(*args)
45
45
  args.each do |page|
46
- @pages.push(page) unless @pages.include?(page) || (page > @searcher.meta[:last_page]) || (page < 1)
46
+ @pages.push(page) unless @pages.include?(page) || (page > @filterer.meta[:last_page]) || (page < 1)
47
47
  end
48
48
  end
49
49
 
@@ -1,3 +1,3 @@
1
1
  module Filterer
2
- VERSION = "0.0.3"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: filterer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Becker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-17 00:00:00.000000000 Z
11
+ date: 2013-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails