desponders 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e54fe6506dfbcfbd55b07f20c47647da2cc553bf
4
- data.tar.gz: b0d9692bcbcceb0798ee20943ef4ed75849fa47d
3
+ metadata.gz: 79f82811106888d082d1ba045451634c2375fa58
4
+ data.tar.gz: 395e71ab26c0c0ca809d8b9d35b8bb6a6928e95f
5
5
  SHA512:
6
- metadata.gz: 53ff2a38c22f6b6a441eda7df9e8870febd397e978afd8736e216a15311036c11ab27d0277746767981bce161b6f636f6932a3c5d7d1eae6056c1449bd29357c
7
- data.tar.gz: 4f80b5479461aa336fe2946ae7356413ea68a9c5893c1fd86b8d8c2e10acf1c2e0d231f7d94b0636a3fa588f7f57483b3b869e3bb256e6a3e98e5d361ebefc5b
6
+ metadata.gz: 1053085be5b10413f821c997f09ae1de4c47139f117ea328798d4e588bef73cc6e2f55b04c5e352978c8993709daa581e6aa86b528310ba16de1ddb916e78a2d
7
+ data.tar.gz: a4f2ed77a87a2c44913b4a8bce69f0c7f40e0c39ef05a9c46fc07a0180d45170cf32f375e2d03ead9c659abf1ac4082e1a8d2574c02c5bc398c7fe17df9d711b
@@ -1,9 +1,13 @@
1
- # 0.2.0
1
+ ## v0.3.0 (2013-12-17)
2
2
 
3
- - Initial release ported from internal responders. Initial set of responders
3
+ * Remove automatic LINK header insertion from PaginatedResponder.
4
+
5
+ ## v0.2.0 (2013-08-05)
6
+
7
+ * Initial release ported from internal responders. Initial set of responders
4
8
  includes:
5
9
 
6
- - Error
7
- - HttpCaching
8
- - Paginated
9
- - Rest
10
+ * Error
11
+ * HttpCaching
12
+ * Paginated
13
+ * Rest
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
  [![Build Status](https://travis-ci.org/dscout/desponders.png?branch=master)](https://travis-ci.org/dscout/desponders)
2
+ [![Code Climate](https://codeclimate.com/github/dscout/desponders.png)](https://codeclimate.com/github/dscout/desponders)
2
3
 
3
4
  # Desponders
4
5
 
@@ -9,25 +10,19 @@ A stack of light-weight responders tailored to JSON APIs.
9
10
  Add this line to your application's Gemfile:
10
11
 
11
12
  ```ruby
12
- gem 'desponders', '0.2.0'
13
+ gem 'desponders', '~> 0.2.0'
13
14
  ```
14
15
 
15
16
  ## Usage
16
17
 
17
- Use the provided `ApiResponder`, which includes all of the responder modules in
18
- a sane order:
19
-
20
- * Desponders::ErrorResponder
21
- * Desponders::RESTResponder
22
- * Desponders::PaginatedResponder
23
- * Desponders::HTTPCacheResponder
24
-
25
- Alternatively, create a `ActionController::Responder` subclass and include the
26
- responders that you would like to use:
18
+ Create a `ActionController::Responder` subclass and include the responders that
19
+ you would like to use:
27
20
 
28
21
  ```ruby
29
22
  class CustomResponder < ActionController::Responder
23
+ include Desponders::ErrorResponder
30
24
  include Desponders::RESTResponder
25
+ include Desponders::PaginatedResponder
31
26
  include Desponders::HTTPCacheResponder
32
27
  end
33
28
  ```
@@ -36,14 +31,16 @@ Include the responder in any controllers serving API requests:
36
31
 
37
32
  ```ruby
38
33
  class ApplicationController < ActionController::Base
39
- # Included
40
- self.responder = Desponder::Responder
41
-
42
- # Custom
43
34
  self.responder = CustomResponder
44
35
  end
45
36
  ```
46
37
 
38
+ ## PaginatedResponder
39
+
40
+ The `PaginatedResponder` automatically applies pagination to every multi
41
+ resource GET request. In order for pagination to work your resources must
42
+ respond to a `paginate` method that accepts `page` and `per_page` options.
43
+
47
44
  ## Thanks
48
45
 
49
46
  The implementation of Desponders is based on the fanstastic work of Jose Valim
@@ -4,10 +4,7 @@ module Desponders
4
4
  module PaginatedResponder
5
5
  def to_format
6
6
  if get? && resource.respond_to?(:paginate)
7
- self.resource_size = resource.size
8
- self.resource = resource.paginate(page: page, per_page: per_page)
9
-
10
- response.headers['Link'] = link_headers
7
+ self.resource = resource.paginate(page: page, per_page: per_page)
11
8
  end
12
9
 
13
10
  super
@@ -15,7 +12,7 @@ module Desponders
15
12
 
16
13
  private
17
14
 
18
- attr_accessor :resource, :resource_size
15
+ attr_accessor :resource
19
16
 
20
17
  delegate :response, :request, to: :controller
21
18
 
@@ -34,36 +31,5 @@ module Desponders
34
31
  def per_page
35
32
  (request.params[:per_page] || default_per_page).to_i
36
33
  end
37
-
38
- def first_page
39
- 1
40
- end
41
-
42
- def prev_page
43
- [first_page, page - 1].max
44
- end
45
-
46
- def next_page
47
- [last_page, page + 1].min
48
- end
49
-
50
- def last_page
51
- calculated = (resource_size.to_f / per_page).ceil
52
-
53
- calculated.zero? ? 1 : calculated
54
- end
55
-
56
- def link_headers
57
- base, rest = request.url.split('?')
58
-
59
- [construct_link_rel(base, first_page, per_page, 'first'),
60
- construct_link_rel(base, prev_page, per_page, 'prev'),
61
- construct_link_rel(base, next_page, per_page, 'next'),
62
- construct_link_rel(base, last_page, per_page, 'last')].join(',')
63
- end
64
-
65
- def construct_link_rel(base, page, per_page, rel)
66
- %(#{base}?page=#{page}&per_page=#{per_page}; rel="#{rel}")
67
- end
68
34
  end
69
35
  end
@@ -1,3 +1,3 @@
1
1
  module Desponders
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -23,86 +23,26 @@ describe Desponders::PaginatedResponder do
23
23
  let(:paginated) { double(:paginated) }
24
24
  let(:request) { double(:request, params: {}, url: 'https://example.com/missions') }
25
25
  let(:response) { double(:response, headers: {}) }
26
- let(:resource) { double(:resource, paginate: paginated, size: 100) }
26
+ let(:resource) { double(:resource, paginate: paginated) }
27
27
 
28
28
  subject(:responder) { MockPaginatedResponder.new(controller, resource) }
29
29
 
30
- def link_header
31
- controller.response.headers['Link']
30
+ it 'replaces the current resource with a paginated scope' do
31
+ responder.to_format
32
+ responder.resource.should eq(paginated)
32
33
  end
33
34
 
34
- context 'with a paginatable resource on a get request' do
35
- it 'replaces the current resource with a paginated scope' do
36
- responder.to_format
37
- responder.resource.should eq(paginated)
38
- end
39
-
40
- it 'defaults pagination to the first page' do
41
- resource.should_receive(:paginate).with(hash_including(page: 1))
42
- responder.to_format
43
- end
44
-
45
- it 'uses provided page and per_page params' do
46
- resource.should_receive(:paginate).with(page: 2, per_page: 25)
47
-
48
- request.params[:page] = 2
49
- request.params[:per_page] = 25
50
-
51
- responder.to_format
52
- end
53
-
54
- it 'injects resource urls into a LINK header' do
55
- request.params[:page] = 2
56
-
57
- responder.to_format
58
-
59
- link_header.tap do |header|
60
- header.should include('https://example.com/missions?page=1&per_page=30; rel="first"')
61
- header.should include('https://example.com/missions?page=1&per_page=30; rel="prev"')
62
- header.should include('https://example.com/missions?page=3&per_page=30; rel="next"')
63
- header.should include('https://example.com/missions?page=4&per_page=30; rel="last"')
64
- end
65
- end
66
-
67
- it 'ignores params in the request url when constructing headers' do
68
- request.stub(url: 'https://example.com/missions?thing=1&other=2')
69
-
70
- responder.to_format
71
-
72
- link_header.should_not include('?thing=1&other=2')
73
- end
74
-
75
- it 'calculates the next page based on resource size and the per_page value' do
76
- resource.stub(size: 500)
77
-
78
- request.params[:page] = 3
79
- request.params[:per_page] = 50
80
-
81
- responder.to_format
82
-
83
- link_header.tap do |header|
84
- header.should include('page=2&per_page=50; rel="prev"')
85
- header.should include('page=4&per_page=50; rel="next"')
86
- end
87
- end
88
-
89
- it 'prevents the next and last pages from being 0' do
90
- resource.stub(size: 0)
91
-
92
- responder.to_format
93
-
94
- link_header.should include('page=1&per_page=30; rel="next"')
95
- link_header.should include('page=1&per_page=30; rel="last"')
96
- end
97
-
98
- it 'calculates the last page based on resource size and the per_page value' do
99
- resource.stub(size: 500)
35
+ it 'defaults pagination to the first page' do
36
+ resource.should_receive(:paginate).with(hash_including(page: 1))
37
+ responder.to_format
38
+ end
100
39
 
101
- request.params[:per_page] = 50
40
+ it 'uses provided page and per_page params' do
41
+ resource.should_receive(:paginate).with(page: 2, per_page: 25)
102
42
 
103
- responder.to_format
43
+ request.params[:page] = 2
44
+ request.params[:per_page] = 25
104
45
 
105
- link_header.should include('page=10&per_page=50; rel="last"')
106
- end
46
+ responder.to_format
107
47
  end
108
48
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: desponders
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Parker Selbert
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-05 00:00:00.000000000 Z
11
+ date: 2013-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -120,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
120
  version: '0'
121
121
  requirements: []
122
122
  rubyforge_project:
123
- rubygems_version: 2.0.0
123
+ rubygems_version: 2.0.3
124
124
  signing_key:
125
125
  specification_version: 4
126
126
  summary: A stack of light-weight responders tailored to JSON APIs