filterer 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f9c55094d34e875077e3903ba1ed4acbb282d7c9
4
+ data.tar.gz: 5b92580dcd86e828e61d4f65f0ace15355dce657
5
+ SHA512:
6
+ metadata.gz: 8e94fc28aba2a14e917d69b0b9c2eb0de0200f4c2e1c7853567d5a5456707147d3cfce297e01a690e30db5934a15bfdd1cc3e7619a7c70aa2ed0603c5f69daed
7
+ data.tar.gz: c8d31b9d5bcd03cca0e9647317d3a50cdd657f17811bf39fe0debb2640fcf99c830fef4556b86b83a1a997c611b1d3d37b3c22fd5bc9b912d11ef72c53e04d96
data/Rakefile ADDED
@@ -0,0 +1,24 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'Formbuilder'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+
21
+
22
+ Bundler::GemHelper.install_tasks
23
+
24
+ require 'rake/testtask'
@@ -0,0 +1,51 @@
1
+ module Filterer
2
+ module PaginationHelper
3
+
4
+ def render_filterer_pagination(filterer)
5
+ content_tag(:div, class: 'pagination-wrapper') do
6
+ content_tag(:ul, class: 'unstyled') do
7
+ render_filterer_previous_link(filterer) +
8
+ filterer.paginator.pages.map { |p| render_filterer_page_link(filterer, p) }.join('').html_safe +
9
+ render_filterer_next_link(filterer)
10
+ end
11
+ end
12
+ end
13
+
14
+ private
15
+ def calculate_filterer_pagination_url(page)
16
+ url_for(params.merge(page: page))
17
+ end
18
+
19
+ def render_filterer_previous_link(filterer)
20
+ content_tag(:li, class: filterer.meta[:page] == 1 ? "disabled" : '') do
21
+ if filterer.meta[:page] == 1
22
+ content_tag(:span) { '‹' }
23
+ else
24
+ content_tag(:a, class: 'pagination-previous',
25
+ href: calculate_filterer_pagination_url(filterer.meta[:page] - 1)) { '‹' }
26
+ end
27
+ end
28
+ end
29
+
30
+ def render_filterer_next_link(filterer)
31
+ content_tag(:li, class: filterer.meta[:page] == filterer.meta[:last_page] ? "disabled" : '') do
32
+ if filterer.meta[:page] == filterer.meta[:last_page]
33
+ content_tag(:span) { '›' }
34
+ else
35
+ content_tag(:a, class: 'pagination-next', href: calculate_filterer_pagination_url(filterer.meta[:page] + 1)) { '›' }
36
+ end
37
+ end
38
+ end
39
+
40
+ def render_filterer_page_link(filterer, p)
41
+ if p == 'break'
42
+ "<li><span>&hellip;</span></li>"
43
+ else
44
+ content_tag(:li, class: p == filterer.meta[:page] ? 'active' : '') do
45
+ content_tag(:a, href: calculate_filterer_pagination_url(p)) { p.to_s }
46
+ end
47
+ end
48
+ end
49
+
50
+ end
51
+ end
data/lib/filterer.rb ADDED
@@ -0,0 +1,6 @@
1
+ require 'filterer/engine'
2
+ require 'filterer/base'
3
+ require 'filterer/paginator'
4
+
5
+ module Filterer
6
+ end
@@ -0,0 +1,70 @@
1
+ module Filterer
2
+ class Base
3
+
4
+ attr_accessor :results, :meta, :direction, :sort, :params
5
+
6
+ IGNORED_PARAMS = [:page]
7
+
8
+ def initialize(params = {}, opts = {})
9
+ @params, @opts = params, opts
10
+ setup_meta
11
+ find_results
12
+ end
13
+
14
+ def paginator
15
+ @paginator ||= Filterer::Paginator.new(self)
16
+ end
17
+
18
+ def setup_meta
19
+ @meta = {
20
+ page: [@params[:page].to_i, 1].max,
21
+ per_page: 10
22
+ }
23
+ end
24
+
25
+ def find_results
26
+ @results = starting_query
27
+
28
+ # Add params
29
+ add_params_to_query
30
+
31
+ # Order results
32
+ order_results
33
+
34
+ @meta[:total] = @results.count
35
+ @meta[:last_page] = [(@meta[:total].to_f / @meta[:per_page]).ceil, 1].max
36
+ @meta[:page] = [@meta[:last_page], @meta[:page]].min
37
+
38
+ return if @opts[:count_only]
39
+
40
+ # Add custom meta data if we've defined the method
41
+ @meta.merge!(self.custom_meta_data) if self.respond_to?(:custom_meta_data)
42
+
43
+ @results = @results.limit(@meta[:per_page]).offset((@meta[:page] - 1)*@meta[:per_page])
44
+ end
45
+
46
+ def add_params_to_query
47
+ @params.reject { |k, v| k.in?(IGNORED_PARAMS) }
48
+ .select { |k, v| v.present? }
49
+ .each do |k, v|
50
+
51
+ method_name = :"param_#{k}"
52
+ @results = respond_to?(method_name) ? send(method_name, v) : @results
53
+ end
54
+ end
55
+
56
+ def order_results
57
+ # noop
58
+ end
59
+
60
+ def starting_query
61
+ raise 'You must override this method!'
62
+ end
63
+
64
+ def self.count(params = {}, opts = {})
65
+ filterer = self.new(params, { count_only: true }.merge(opts))
66
+ return filterer.meta[:total]
67
+ end
68
+
69
+ end
70
+ end
@@ -0,0 +1,5 @@
1
+ module Filterer
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Filterer
4
+ end
5
+ end
@@ -0,0 +1,51 @@
1
+ module Filterer
2
+ class Paginator
3
+
4
+ attr_reader :pages
5
+
6
+ def initialize(searcher)
7
+ @searcher = searcher
8
+ return @pages = [1] if @searcher.meta[:last_page] == 1
9
+ push_default_pages
10
+ calculate_additional_pages
11
+ add_breaks
12
+ end
13
+
14
+ def push_default_pages
15
+ @pages = [1, 2]
16
+ push_page(@searcher.meta[:last_page], @searcher.meta[:last_page] - 1)
17
+ end
18
+
19
+ def calculate_additional_pages
20
+ offset = 0
21
+ current_page = @searcher.meta[:page]
22
+
23
+ while @pages.length < 11 && ( (current_page - offset >= 1) || (current_page + offset <= @searcher.meta[:last_page]) ) do
24
+ push_page(current_page - offset, current_page + offset)
25
+ offset += 1
26
+ end
27
+ end
28
+
29
+ def add_breaks
30
+ pages_without_breaks = @pages.sort
31
+ pages_with_breaks = []
32
+
33
+ pages_without_breaks.each_with_index do |p, i|
34
+ if pages_without_breaks[i - 1] && (p - pages_without_breaks[i - 1] > 1)
35
+ pages_with_breaks.push 'break'
36
+ end
37
+
38
+ pages_with_breaks.push p
39
+ end
40
+
41
+ @pages = pages_with_breaks
42
+ end
43
+
44
+ def push_page(*args)
45
+ args.each do |page|
46
+ @pages.push(page) unless @pages.include?(page) || (page > @searcher.meta[:last_page]) || (page < 1)
47
+ end
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,3 @@
1
+ module Filterer
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :filterer do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,184 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: filterer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Adam Becker
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-11-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 4.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: capybara
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: coveralls
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: database_cleaner
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard-rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: launchy
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec-rails
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: sqlite3
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: terminal-notifier-guard
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description: Filterer lets your users easily filter results from your ActiveRecord
140
+ models. What does that mean? Let's imagine a page in your application that lists
141
+ the results of Person.all. What if you want to let your users filter the results
142
+ by name? Or email? Or whether or not the Person is an admin? Where does that logic
143
+ go? One answer could be your controller. That gets ugly fast. Another answer could
144
+ be in your models. But passing a bunch of query parameters to a model isn't really
145
+ a good practice either. Enter Filterer.
146
+ email:
147
+ - adam@dobt.co
148
+ executables: []
149
+ extensions: []
150
+ extra_rdoc_files: []
151
+ files:
152
+ - app/helpers/filterer/pagination_helper.rb
153
+ - lib/filterer/base.rb
154
+ - lib/filterer/engine.rb
155
+ - lib/filterer/paginator.rb
156
+ - lib/filterer/version.rb
157
+ - lib/filterer.rb
158
+ - lib/tasks/filterer_tasks.rake
159
+ - Rakefile
160
+ homepage: https://github.com/dobtco/filterer
161
+ licenses:
162
+ - MIT
163
+ metadata: {}
164
+ post_install_message:
165
+ rdoc_options: []
166
+ require_paths:
167
+ - lib
168
+ required_ruby_version: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - '>='
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ required_rubygems_version: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - '>='
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ requirements: []
179
+ rubyforge_project:
180
+ rubygems_version: 2.1.11
181
+ signing_key:
182
+ specification_version: 4
183
+ summary: Easily filter results from your ActiveRecord models.
184
+ test_files: []