desponders 0.2.0 → 0.3.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: 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