spyke-kaminari 0.0.4
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 +7 -0
- data/lib/spyke/kaminari/header_parser.rb +21 -0
- data/lib/spyke/kaminari/relation.rb +54 -0
- data/lib/spyke/kaminari/scopes.rb +19 -0
- data/lib/spyke/kaminari.rb +19 -0
- metadata +118 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4c2b893be4e3c8e97b6381f646202cbcb0a8e9ab
|
4
|
+
data.tar.gz: 4c984f8cfbc6067a2bb63aac2efd1c7e692890fd
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c709df12964400ca5c022d997d28e962a46eebc7c2dfbacccd00ef6ff1fcb85b98df23d19d0cc9336689952645c1181f77c5b5b6d35faadf51e100be25548dc2
|
7
|
+
data.tar.gz: e37f2c451194f7d8e8e5ed1c006fe6135b3a3f951a279e59d088f1623f9ce63d023aa9baaf15328b5e53ffac428cd47de18f3422d727748daa5a80e1287fe5cc
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Spyke::Kaminari
|
2
|
+
class HeaderParser < Faraday::Response::Middleware
|
3
|
+
def on_complete(env)
|
4
|
+
@env = env
|
5
|
+
|
6
|
+
metadata = Spyke::Kaminari::HEADERS.each_with_object({}) do |(symbol, key), hash|
|
7
|
+
hash[symbol] = header(key)
|
8
|
+
end
|
9
|
+
|
10
|
+
@env.body[:metadata] ||= {}
|
11
|
+
@env.body[:metadata][Spyke::Kaminari::METADATA_KEY] = metadata
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def header(key)
|
17
|
+
value = @env.response_headers[key]
|
18
|
+
value.try(:to_i)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Spyke::Kaminari
|
2
|
+
# A Spyke relation extended with pagination metadata and helpers, similar
|
3
|
+
# Kaminari's PaginatableArray.
|
4
|
+
class Relation < Spyke::Relation
|
5
|
+
Spyke::Kaminari::HEADERS.keys.each do |symbol|
|
6
|
+
define_method(symbol) do
|
7
|
+
find_some.metadata[Spyke::Kaminari::METADATA_KEY][symbol]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def first_page?
|
12
|
+
current_page == 1
|
13
|
+
end
|
14
|
+
|
15
|
+
def last_page?
|
16
|
+
current_page == total_pages
|
17
|
+
end
|
18
|
+
|
19
|
+
def out_of_range?
|
20
|
+
current_page > total_pages
|
21
|
+
end
|
22
|
+
|
23
|
+
# Iterates through each page.
|
24
|
+
#
|
25
|
+
# Useful for stitching together an array of all records, across every page.
|
26
|
+
# For example:
|
27
|
+
#
|
28
|
+
# users = User.all.each_page.flat_map(&:to_a)
|
29
|
+
#
|
30
|
+
# If there are 3 total pages, it would result in these HTTP requests:
|
31
|
+
#
|
32
|
+
# GET /v1/users
|
33
|
+
# GET /v1/users?page=2
|
34
|
+
# GET /v1/users?page=3
|
35
|
+
#
|
36
|
+
# ...and this array of users (25 records per page):
|
37
|
+
#
|
38
|
+
# users.count
|
39
|
+
# # => 75
|
40
|
+
#
|
41
|
+
# With the exception of the first one, pages are lazily fetched.
|
42
|
+
def each_page
|
43
|
+
return to_enum(:each_page) unless block_given?
|
44
|
+
|
45
|
+
relation = clone
|
46
|
+
yield relation
|
47
|
+
return if relation.last_page? || relation.out_of_range?
|
48
|
+
|
49
|
+
(relation.next_page..relation.total_pages).each do |number|
|
50
|
+
yield clone.page(number)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Spyke::Kaminari
|
2
|
+
module Scopes
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
%i{page per_page offset}.each do |symbol|
|
7
|
+
scope symbol, ->(value) { where(symbol => value) }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
# Overrides the method included by Spyke::Scoping to return paginated
|
13
|
+
# relations.
|
14
|
+
def all
|
15
|
+
current_scope || Spyke::Kaminari::Relation.new(self, uri: uri)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'active_support/core_ext'
|
2
|
+
|
3
|
+
module Spyke::Kaminari
|
4
|
+
HEADERS = {
|
5
|
+
total_count: 'X-Total',
|
6
|
+
total_pages: 'X-Total-Pages',
|
7
|
+
limit_value: 'X-Per-Page',
|
8
|
+
current_page: 'X-Page',
|
9
|
+
next_page: 'X-Next-Page',
|
10
|
+
prev_page: 'X-Prev-Page',
|
11
|
+
offset_value: 'X-Offset'
|
12
|
+
}
|
13
|
+
|
14
|
+
METADATA_KEY = :kaminari
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'spyke/kaminari/header_parser'
|
18
|
+
require 'spyke/kaminari/relation'
|
19
|
+
require 'spyke/kaminari/scopes'
|
metadata
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: spyke-kaminari
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.4
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Todd Mazierski
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-03-23 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: spyke
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '4'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.1.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.1.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.10.1
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.10.1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: webmock
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.20'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.20'
|
83
|
+
description:
|
84
|
+
email:
|
85
|
+
- todd@generalassemb.ly
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- lib/spyke/kaminari.rb
|
91
|
+
- lib/spyke/kaminari/header_parser.rb
|
92
|
+
- lib/spyke/kaminari/relation.rb
|
93
|
+
- lib/spyke/kaminari/scopes.rb
|
94
|
+
homepage: https://github.com/generalassembly/spyke-kaminari
|
95
|
+
licenses: []
|
96
|
+
metadata: {}
|
97
|
+
post_install_message:
|
98
|
+
rdoc_options: []
|
99
|
+
require_paths:
|
100
|
+
- lib
|
101
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
requirements: []
|
112
|
+
rubyforge_project:
|
113
|
+
rubygems_version: 2.2.2
|
114
|
+
signing_key:
|
115
|
+
specification_version: 4
|
116
|
+
summary: Kaminari pagination for Spyke models
|
117
|
+
test_files: []
|
118
|
+
has_rdoc:
|