pagoid 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.
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ db/
19
+ *.db
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
@@ -0,0 +1 @@
1
+ pagoid
@@ -0,0 +1 @@
1
+ ruby-1.9.3-p327
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pagoid.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Jon Phenow
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,69 @@
1
+ # Pagoid
2
+
3
+ Pagoid extracts the difference between [WillPaginate](https://github.com/mislav/will_paginate) and
4
+ [Kaminari](https://github.com/amatsuda/kaminari) as well as provides a standard callback
5
+ for things like publishing page info to your clients.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'kaminari'
13
+ # OR
14
+ gem 'will_paginate'
15
+
16
+ gem 'pagoid'
17
+ ```
18
+
19
+ And then execute:
20
+
21
+ ```bash
22
+ $ bundle
23
+ ```
24
+
25
+ ## Usage
26
+
27
+ ```ruby
28
+ class PeopleController < ApplicationController
29
+ paged do |pager|
30
+ metadata[:paging] = pager.headers if pager.display_headers?
31
+ end
32
+
33
+ def index
34
+ @people = paginated Person
35
+ render json: { metadata: metdata, result: @people }
36
+ end
37
+
38
+ private
39
+ def metadata
40
+ @metdata ||= {}
41
+ end
42
+ end
43
+ ```
44
+
45
+ You can stack `paged` blocks through inheritance:
46
+
47
+ ```ruby
48
+ class ApplicationController < ActionController::Base
49
+ paged do |pager|
50
+ notice! pager.headers
51
+ end
52
+
53
+ def notice!(hash)
54
+ Rails.logger.debug hash
55
+ end
56
+ end
57
+
58
+ class PeopleController < ApplicationController
59
+ #.. from above
60
+ end
61
+ ```
62
+
63
+ ## Contributing
64
+
65
+ 1. Fork it
66
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
67
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
68
+ 4. Push to the branch (`git push origin my-new-feature`)
69
+ 5. Create new Pull Request
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,21 @@
1
+ require "pagoid/version"
2
+ begin
3
+ require 'kaminari'
4
+ require 'kaminari/models/array_extension'
5
+ if defined?(ActiveRecord::Base)
6
+ require 'kaminari/models/active_record_extension'
7
+ ::ActiveRecord::Base.send :include, Kaminari::ActiveRecordExtension
8
+ end
9
+ rescue LoadError
10
+ begin
11
+ require 'will_paginate'
12
+ require 'will_paginate/array'
13
+ rescue LoadError
14
+ raise LoadError, "Please install kaminari or will_paginate for Pagoid backends"
15
+ end
16
+ end
17
+
18
+ require 'pagoid/pager'
19
+ require 'pagoid/controller_extensions'
20
+ require 'pagoid/adapter_router'
21
+ require 'pagoid/engine' if defined?(Rails)
@@ -0,0 +1,58 @@
1
+ require 'pagoid/paging_adapter'
2
+ module Pagoid
3
+ class AdapterRouter
4
+ private
5
+ attr_accessor :pageable
6
+
7
+ def initialize(pageable)
8
+ self.pageable = pageable
9
+ end
10
+
11
+ public
12
+
13
+ def route
14
+ chosen_adapter = configured || route_table.find { |routeable| useable? routeable }
15
+ raise RouterError, "Could not find a suitable Pagoid Adapter" unless chosen_adapter
16
+ load_dependencies chosen_adapter
17
+ constantize(pagoided(chosen_adapter)).new pageable
18
+ end
19
+
20
+ private
21
+
22
+ def configured
23
+ end
24
+
25
+ def pagoided(adapter)
26
+ "::Pagoid::#{adapter}"
27
+ end
28
+
29
+ def load_dependencies(adapter)
30
+ require "pagoid/#{underscore(adapter)}"
31
+ end
32
+
33
+ def underscore(adapter_name)
34
+ adapter_name.gsub(/::/, '/')
35
+ .gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
36
+ .gsub(/([a-z\d])([A-Z])/,'\1_\2')
37
+ .tr("-", "_")
38
+ .downcase
39
+ end
40
+
41
+ def useable?(adapter)
42
+ constantize "::#{adapter}"
43
+ rescue NameError
44
+ false
45
+ end
46
+
47
+ def constantize(adapter)
48
+ Object.module_eval(adapter)
49
+ end
50
+
51
+ def route_table
52
+ %w[
53
+ Kaminari
54
+ WillPaginate
55
+ ]
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,33 @@
1
+ module Pagoid
2
+ module ControllerExtensions
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ def paginated(resource)
8
+ pager = Pager.new(resource, params)
9
+ self.class.apply_pager_blocks(self, pager)
10
+ pager.paginated
11
+ end
12
+
13
+ module ClassMethods
14
+ def paged(&block)
15
+ @pagination_block = block
16
+ end
17
+
18
+ def apply_pager_blocks(context, pager_instance)
19
+ pager_blocks.each { |block| context.instance_exec(pager_instance, &block) }
20
+ end
21
+
22
+ def pager_block
23
+ @pagination_block || ->(x) { x }
24
+ end
25
+ private :pager_block
26
+
27
+ def pager_blocks
28
+ [pager_block] + (superclass.respond_to?(:pager_blocks) ? superclass.pager_blocks : [])
29
+ end
30
+ protected :pager_blocks
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,10 @@
1
+ require 'rails/engine'
2
+ module Pagoid
3
+ class Engine < Rails::Engine
4
+ initializer 'pagoid.engine' do |app|
5
+ ActiveSupport.on_load(:action_controller) do
6
+ include Pagoid::ControllerExtensions
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,22 @@
1
+ require 'pagoid/paging_adapter'
2
+ module Pagoid
3
+ class Kaminari < PagingAdapter
4
+ def coerce(coerceable = paginatable)
5
+ coerce?(coerceable) ? ::Kaminari.paginate_array(Array(coerceable)) : coerceable
6
+ end
7
+
8
+ def page(*args)
9
+ __getobj__.page(*args)
10
+ end
11
+
12
+ private
13
+
14
+ def coerce?(coerceable = paginatable)
15
+ !(
16
+ coerceable.respond_to?(:order) &&
17
+ coerceable.respond_to?(:page) &&
18
+ coerceable.page.respond_to?(:per)
19
+ )
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,123 @@
1
+ require 'forwardable'
2
+ # Service Class for handling of adapting paging for both Arrays and ActiveRecord objects.
3
+ # An array of AR Objects should come out the same as if you were to pass in a relation (though
4
+ # likely much slower).
5
+ #
6
+ # Defaults:
7
+ # page: 1
8
+ # per_page: 100
9
+ # order_by: Object <=> Object
10
+ # direction: Descending
11
+ module Pagoid
12
+ class Pager
13
+ extend Forwardable
14
+ def_delegators :paginatable, :coerce
15
+
16
+ # Initialize
17
+ #
18
+ # @param [Object] paginatable Some object(like an Array or ActiveRecord Object) for pagination
19
+ # @param [Hash] options options hash for tweaking pagination
20
+ # @option options [Fixnum] :page The page number
21
+ # @option options [Fixnum] :per_page The page size
22
+ # @option options [Fixnum] :order_by Callable on each element (or column) to sort by
23
+ # @option options [Fixnum] :direction "desc" or "asc"
24
+ def initialize(paginatable, options = {})
25
+ self.paginatable = AdapterRouter.new(paginatable).route
26
+ self.options = options.dup
27
+ end
28
+
29
+ # Memoized method of Paged, Sized, and Ordered output
30
+ #
31
+ # @return ordered, sized, paged data
32
+ def paginated
33
+ @paginated ||= pered
34
+ end
35
+
36
+ # Hash of data for publishing on a payload for Paging reference
37
+ #
38
+ # @return [Hash] hash of paging data
39
+ def headers
40
+ {
41
+ total: paginated.total_count,
42
+ total_pages: paginated.total_pages,
43
+ first_page: paginated.first_page?,
44
+ last_page: paginated.last_page?,
45
+ current_page: paginated.current_page,
46
+ limit: paginated.limit_value,
47
+ offset: paginated.offset_value
48
+ }
49
+ end
50
+
51
+ # Describes whether or not to publish paging reference
52
+ #
53
+ # @return boolean describing whether to display pagination headers
54
+ def display_headers?
55
+ !paginated.nil?
56
+ end
57
+
58
+ private
59
+
60
+ attr_accessor :paginatable
61
+ attr_accessor :options
62
+
63
+ def pered
64
+ paged.per(per_page)
65
+ end
66
+
67
+ def ordered
68
+ coerce(order_callable.call(paginatable))
69
+ end
70
+
71
+ def paged
72
+ ordered.page(page)
73
+ end
74
+
75
+ def per_page
76
+ options[:per_page].to_i > 0 ? options[:per_page].to_i : 100
77
+ end
78
+
79
+ def order_callable
80
+ order_method_hash[order_method] || sort_proc || ->(o) { o }
81
+ end
82
+
83
+ def order_method
84
+ order_methods.find { |method| coerce.respond_to? method }
85
+ end
86
+
87
+ def order_method_hash
88
+ {
89
+ order: ->(orderable) { orderable.order "#{order_by} #{direction}" }
90
+ }
91
+ end
92
+
93
+ def sort_proc
94
+ if coerce.respond_to?(:sort)
95
+ ->(orderable) {
96
+ orderable.sort { |a,b|
97
+ direction == :asc ? order_by_value(a) <=> order_by_value(b) : order_by_value(b) <=> order_by_value(a)
98
+ }
99
+ }
100
+ end
101
+ end
102
+
103
+ def order_by_value(orderable)
104
+ orderable.respond_to?(order_by) ? orderable.public_send(order_by) : orderable
105
+ end
106
+
107
+ def order_methods
108
+ order_method_hash.keys
109
+ end
110
+
111
+ def page
112
+ options[:page].to_i > 0 ? options[:page].to_i : 1
113
+ end
114
+
115
+ def order_by
116
+ (!options[:order_by].nil? ? options[:order_by] : :created_at).to_s
117
+ end
118
+
119
+ def direction
120
+ options[:direction].to_s == "asc" ? :asc : :desc
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,27 @@
1
+ require 'delegate'
2
+ module Pagoid
3
+ class PagingAdapter < SimpleDelegator
4
+ attr_accessor :paginatable
5
+ attr_accessor :attributes
6
+
7
+ def initialize(paginatable, attributes = {})
8
+ self.paginatable = paginatable
9
+ self.attributes = attributes
10
+ super coerce
11
+ end
12
+
13
+ def coerce(coerceable = paginatable)
14
+ coerceable
15
+ end
16
+
17
+ %w[page per order].each do |meth|
18
+ define_method(meth) do |*args|
19
+ chain(super(*args))
20
+ end
21
+ end
22
+
23
+ def chain(object, state = {})
24
+ self.class.new object, state
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module Pagoid
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,50 @@
1
+ require 'pagoid/paging_adapter'
2
+ module Pagoid
3
+ class WillPaginate < PagingAdapter
4
+ def total_count
5
+ count
6
+ end
7
+
8
+ def limit_value
9
+ per_page
10
+ end
11
+
12
+ def offset_value
13
+ offset
14
+ end
15
+
16
+ def page(num)
17
+ if array?
18
+ chain __getobj__.paginate(page: num), original: __getobj__, page: num
19
+ else
20
+ chain super
21
+ end
22
+ end
23
+
24
+ def per(num)
25
+ if array?
26
+ chain per_object.paginate(page: attributes[:page], per_page: num)
27
+ else
28
+ chain __getobj__.per_page(num)
29
+ end
30
+ end
31
+
32
+ def first_page?
33
+ current_page == 1
34
+ end
35
+
36
+ def last_page?
37
+ current_page == total_pages
38
+ end
39
+
40
+ private
41
+
42
+ def per_object
43
+ attributes[:original] || __getobj__
44
+ end
45
+
46
+ def array?
47
+ __getobj__.respond_to? :paginate
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'pagoid/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "pagoid"
8
+ spec.version = Pagoid::VERSION
9
+ spec.authors = ["Jon Phenow"]
10
+ spec.email = ["j.phenow@gmail.com"]
11
+ spec.description = %q{Standardize paging abstraction}
12
+ spec.summary = %q{Easy way to paginate with will_paginate or kaminari backends}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "kaminari"
25
+ spec.add_development_dependency "will_paginate"
26
+ spec.add_development_dependency "activerecord"
27
+ spec.add_development_dependency "sqlite3"
28
+ spec.add_development_dependency "simplecov"
29
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ require 'pagoid/kaminari'
3
+ require 'kaminari'
4
+ require 'kaminari/models/array_extension'
5
+ module Pagoid
6
+ describe Kaminari do
7
+ subject { described_class.new decorated }
8
+ before do
9
+ AdapterRouter.any_instance.stub configured: "Kaminari"
10
+ end
11
+
12
+ let(:decorated) { [] }
13
+
14
+ it_should_behave_like "a pager adapter"
15
+
16
+ its(:coerce) { should be_a ::Kaminari::PaginatableArray }
17
+
18
+ describe "with active record" do
19
+ let(:decorated) { Person }
20
+
21
+ its(:coerce) { should == Person }
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,92 @@
1
+ require 'spec_helper'
2
+ module Pagoid
3
+ describe Pager do
4
+ describe "array paging" do
5
+ let(:paginatable) { (1..10).to_a }
6
+ let(:options) { {} }
7
+ subject { described_class.new paginatable, options }
8
+
9
+ its(:paginated) { should == paginatable.reverse }
10
+ its(:display_headers?) { should be_true }
11
+
12
+ describe "with options" do
13
+ let(:options) { { per_page: per_page, page: page } }
14
+ let(:per_page) { 2 }
15
+ let(:page) { 1 }
16
+
17
+ its(:paginated) { should == [10,9] }
18
+ its(:display_headers?) { should be_true }
19
+
20
+ describe "sorting" do
21
+ let(:options) { { per_page: per_page, page: page, order_by: :to_s } }
22
+
23
+ its(:paginated) { should == [9,8] }
24
+ its(:display_headers?) { should be_true }
25
+
26
+ describe "with paging" do
27
+ let(:page) { 3 }
28
+
29
+ its(:paginated) { should == [5,4] }
30
+ its(:display_headers?) { should be_true }
31
+
32
+ describe "with direction" do
33
+ let(:page) { nil }
34
+ let(:options) { { per_page: per_page, page: page, order_by: :to_s, direction: "asc" } }
35
+
36
+ its(:paginated) { should == [1,10] }
37
+ its(:display_headers?) { should be_true }
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ describe "ActiveRecord paging" do
45
+ before do
46
+ %w[Adam Jon Mike Pat].each do |name|
47
+ Person.create(name: name)
48
+ end
49
+ end
50
+
51
+ let(:paginatable) { Person }
52
+ let(:options) { {} }
53
+ subject { described_class.new paginatable, options }
54
+
55
+ its(:paginated) { should == paginatable.order("created_at desc").all }
56
+ its(:display_headers?) { should be_true }
57
+
58
+ describe "with options" do
59
+ let(:options) { { per_page: per_page, page: page } }
60
+ let(:per_page) { 2 }
61
+ let(:page) { 1 }
62
+
63
+ its(:paginated) { should == Person.order("created_at desc").page(page).per(per_page) }
64
+ its(:display_headers?) { should be_true }
65
+
66
+ describe "sorting" do
67
+ let(:options) { { per_page: per_page, page: page, order_by: :name } }
68
+
69
+ its(:paginated) { should == Person.order("#{options[:order_by]} desc").page(page).per(per_page) }
70
+ its(:display_headers?) { should be_true }
71
+
72
+ describe "with paging" do
73
+ let(:page) { 2 }
74
+
75
+ its(:paginated) {
76
+ should == Person.page(page).per(options[:per_page]).order("#{options[:order_by]} desc")
77
+ }
78
+ its(:display_headers?) { should be_true }
79
+
80
+ describe "with direction" do
81
+ let(:page) { nil }
82
+ let(:options) { { per_page: per_page, page: page, order_by: :name, direction: "asc" } }
83
+
84
+ its(:paginated) { should == Person.order("name ASC").first(2) }
85
+ its(:display_headers?) { should be_true }
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ require 'pagoid/will_paginate'
3
+ require 'will_paginate'
4
+ require 'will_paginate/array'
5
+ module Pagoid
6
+ describe WillPaginate do
7
+ subject { described_class.new decorated }
8
+ before do
9
+ AdapterRouter.any_instance.stub configured: "WillPaginate"
10
+ end
11
+
12
+ let(:decorated) { [] }
13
+
14
+ it_should_behave_like "a pager adapter"
15
+
16
+ describe "with active record" do
17
+ let(:decorated) { Person }
18
+
19
+ its(:coerce) { should == Person }
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ require 'active_record'
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_filter "/spec/"
5
+ end
6
+
7
+ require 'pagoid'
8
+
9
+ Dir["./spec/support/**/*.rb"].sort.each {|f| require f}
10
+
11
+ RSpec.configure do |config|
12
+ config.treat_symbols_as_metadata_keys_with_true_values = true
13
+ config.run_all_when_everything_filtered = true
14
+ config.filter_run :focus
15
+
16
+ config.before { Person.delete_all }
17
+
18
+ # --seed 1234
19
+ config.order = 'random'
20
+ end
@@ -0,0 +1,28 @@
1
+ shared_examples "a specific page adaptation" do
2
+ it { should respond_to :page }
3
+ it { should respond_to :coerce }
4
+
5
+ describe "post-page methods" do
6
+ subject { described_class.new(decorated).page(1).per(1) }
7
+ it { should respond_to :total_count }
8
+ it { should respond_to :total_pages }
9
+ it { should respond_to :first_page? }
10
+ it { should respond_to :last_page? }
11
+ it { should respond_to :current_page }
12
+ it { should respond_to :limit_value }
13
+ it { should respond_to :offset_value }
14
+ end
15
+ end
16
+
17
+ shared_examples "a pager adapter" do
18
+ subject { described_class.new decorated }
19
+ let(:decorated) { [] }
20
+
21
+ it_should_behave_like "a specific page adaptation"
22
+
23
+ describe "with active record" do
24
+ let(:decorated) { Person }
25
+
26
+ it_should_behave_like "a specific page adaptation"
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ root = File.expand_path File.join(__FILE__, "../../../")
2
+ ActiveRecord::Base.establish_connection(
3
+ adapter: "sqlite3",
4
+ database: "#{root}/spec/support/pagoid.db"
5
+ )
6
+
7
+ ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS 'people'")
8
+
9
+ ActiveRecord::Base.connection.create_table(:people) do |t|
10
+ t.string :name
11
+ t.timestamps
12
+ end
13
+
14
+ class Person < ActiveRecord::Base
15
+ end
metadata ADDED
@@ -0,0 +1,210 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pagoid
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jon Phenow
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-07-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: kaminari
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: will_paginate
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: activerecord
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: sqlite3
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
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
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: simplecov
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ description: Standardize paging abstraction
143
+ email:
144
+ - j.phenow@gmail.com
145
+ executables: []
146
+ extensions: []
147
+ extra_rdoc_files: []
148
+ files:
149
+ - .gitignore
150
+ - .rspec
151
+ - .ruby-gemset
152
+ - .ruby-version
153
+ - Gemfile
154
+ - LICENSE.txt
155
+ - README.md
156
+ - Rakefile
157
+ - lib/pagoid.rb
158
+ - lib/pagoid/adapter_router.rb
159
+ - lib/pagoid/controller_extensions.rb
160
+ - lib/pagoid/engine.rb
161
+ - lib/pagoid/kaminari.rb
162
+ - lib/pagoid/pager.rb
163
+ - lib/pagoid/paging_adapter.rb
164
+ - lib/pagoid/version.rb
165
+ - lib/pagoid/will_paginate.rb
166
+ - pagoid.gemspec
167
+ - spec/lib/pagoid/kaminari_spec.rb
168
+ - spec/lib/pagoid/pager_spec.rb
169
+ - spec/lib/pagoid/will_paginate_spec.rb
170
+ - spec/spec_helper.rb
171
+ - spec/support/adapter_shared_example.rb
172
+ - spec/support/person.rb
173
+ homepage: ''
174
+ licenses:
175
+ - MIT
176
+ post_install_message:
177
+ rdoc_options: []
178
+ require_paths:
179
+ - lib
180
+ required_ruby_version: !ruby/object:Gem::Requirement
181
+ none: false
182
+ requirements:
183
+ - - ! '>='
184
+ - !ruby/object:Gem::Version
185
+ version: '0'
186
+ segments:
187
+ - 0
188
+ hash: -1133189516884409261
189
+ required_rubygems_version: !ruby/object:Gem::Requirement
190
+ none: false
191
+ requirements:
192
+ - - ! '>='
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ segments:
196
+ - 0
197
+ hash: -1133189516884409261
198
+ requirements: []
199
+ rubyforge_project:
200
+ rubygems_version: 1.8.24
201
+ signing_key:
202
+ specification_version: 3
203
+ summary: Easy way to paginate with will_paginate or kaminari backends
204
+ test_files:
205
+ - spec/lib/pagoid/kaminari_spec.rb
206
+ - spec/lib/pagoid/pager_spec.rb
207
+ - spec/lib/pagoid/will_paginate_spec.rb
208
+ - spec/spec_helper.rb
209
+ - spec/support/adapter_shared_example.rb
210
+ - spec/support/person.rb