my_api_client 0.14.0 → 0.15.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 +4 -4
- data/.dependabot/config.yml +22 -1
- data/CHANGELOG.md +48 -0
- data/Gemfile.lock +2 -2
- data/README.jp.md +62 -0
- data/example/api_clients/my_pagination_api_client.rb +18 -0
- data/lib/my_api_client/error_handling.rb +3 -2
- data/lib/my_api_client/request/basic.rb +34 -0
- data/lib/my_api_client/request/pagination.rb +39 -0
- data/lib/my_api_client/request.rb +28 -33
- data/lib/my_api_client/version.rb +1 -1
- data/lib/my_api_client.rb +2 -0
- data/my_api/.ruby-version +1 -1
- data/my_api/Gemfile.lock +40 -40
- data/my_api/README.md +6 -0
- data/my_api/app/controllers/pagination_controller.rb +58 -0
- data/my_api/config/routes.rb +1 -0
- data/my_api/spec/controllers/pagination_controller_spec.rb +73 -0
- data/my_api/spec/spec_helper.rb +5 -0
- metadata +7 -3
- data/renovate.json +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b40beeb8a70a00452e59208a5c7e2d5dee2c8155d2e23b5cd950e1a7e6f3eb1
|
4
|
+
data.tar.gz: 15c927bb0954c12225a73955b23b7ccc71b784a2cb63832f7914a757f2ac2ed2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c57cfcf7db9a8b9d45ee0c603402c910d2ea59bc0f3b406ba2c91388e9b0bab0997fe948dea5944fbc06499ea259c83579a154158808cce7433ea8d0beb02236
|
7
|
+
data.tar.gz: acc4846d877c8aace073858a102c72cc13245d6b13c94542b90d5da43798d04a6317533797b3e92a7e7710f532936ae551a0fa9cb1dcc8151bf58c68f5f06e24
|
data/.dependabot/config.yml
CHANGED
@@ -2,9 +2,30 @@ version: 1
|
|
2
2
|
update_configs:
|
3
3
|
- package_manager: "ruby:bundler"
|
4
4
|
directory: "/"
|
5
|
-
update_schedule: "
|
5
|
+
update_schedule: "weekly"
|
6
6
|
default_reviewers:
|
7
7
|
- "ryz310"
|
8
|
+
default_assignees:
|
9
|
+
- "ryz310"
|
10
|
+
default_labels:
|
11
|
+
- "dependabot"
|
12
|
+
ignored_updates:
|
13
|
+
- match:
|
14
|
+
dependency_name: "rubocop*"
|
15
|
+
automerged_updates:
|
16
|
+
- match:
|
17
|
+
dependency_type: "development"
|
18
|
+
update_type: "all"
|
19
|
+
- match:
|
20
|
+
dependency_type: "production"
|
21
|
+
update_type: "semver:patch"
|
22
|
+
- package_manager: "ruby:bundler"
|
23
|
+
directory: "/my_api"
|
24
|
+
update_schedule: "weekly"
|
25
|
+
default_reviewers:
|
26
|
+
- "ryz310"
|
27
|
+
default_assignees:
|
28
|
+
- "ryz310"
|
8
29
|
default_labels:
|
9
30
|
- "dependabot"
|
10
31
|
automerged_updates:
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,53 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## v0.15.0 (Mar 21, 2020)
|
4
|
+
|
5
|
+
### Feature
|
6
|
+
|
7
|
+
* [#220](https://github.com/ryz310/my_api_client/pull/220) Pageable HTTP request ([@ryz310](https://github.com/ryz310))
|
8
|
+
* Add `#pageable_get` method (alias: `#pget`)
|
9
|
+
* For example:
|
10
|
+
* API client definition
|
11
|
+
```ruby
|
12
|
+
class MyPaginationApiClient < ApplicationApiClient
|
13
|
+
endpoint 'https://example.com/v1'
|
14
|
+
|
15
|
+
# GET pagination?page=1
|
16
|
+
def pagination
|
17
|
+
pageable_get 'pagination', paging: '$.links.next', headers: headers, query: { page: 1 }
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def headers
|
23
|
+
{ 'Content-Type': 'application/json;charset=UTF-8' }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
```
|
27
|
+
* The pagination API response
|
28
|
+
```json
|
29
|
+
{
|
30
|
+
"links": {
|
31
|
+
"next": "https://example.com/pagination?page=3",
|
32
|
+
"previous": "https://example.com/pagination?page=1",
|
33
|
+
},
|
34
|
+
"page": 2
|
35
|
+
}
|
36
|
+
```
|
37
|
+
* Usage
|
38
|
+
```ruby
|
39
|
+
api_clinet = MyPaginationApiClient.new
|
40
|
+
api_clinet.pagination.each do |response|
|
41
|
+
# Do something.
|
42
|
+
end
|
43
|
+
|
44
|
+
p = api_clinet.pagination
|
45
|
+
p.next # => 1st page result
|
46
|
+
p.next # => 2nd page result
|
47
|
+
p.next # => 3rd page result
|
48
|
+
```
|
49
|
+
* [#223](https://github.com/ryz310/my_api_client/pull/223) Use Enumerator::Lazy instead of Enumerator ([@ryz310](https://github.com/ryz310))
|
50
|
+
|
3
51
|
## v0.14.0 (Mar 14, 2020)
|
4
52
|
|
5
53
|
### Feature
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
my_api_client (0.
|
4
|
+
my_api_client (0.15.0)
|
5
5
|
activesupport (>= 4.2.0)
|
6
6
|
faraday (>= 0.17.1)
|
7
7
|
jsonpath
|
@@ -10,7 +10,7 @@ PATH
|
|
10
10
|
GEM
|
11
11
|
remote: https://rubygems.org/
|
12
12
|
specs:
|
13
|
-
activesupport (5.2.4.
|
13
|
+
activesupport (5.2.4.2)
|
14
14
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
15
15
|
i18n (>= 0.7, < 2)
|
16
16
|
minitest (~> 5.1)
|
data/README.jp.md
CHANGED
@@ -83,6 +83,68 @@ api_clinet.get_users #=> #<Sawyer::Response>
|
|
83
83
|
|
84
84
|
続いて、 `#get_users` や `#post_user` を定義します。メソッド名には API のタイトルを付けると良いと思います。メソッド内部で `#get` や `#post` を呼び出していますが、これがリクエスト時の HTTP Method になります。他にも `#patch` `#put` `#delete` が利用可能です。
|
85
85
|
|
86
|
+
### Pagination
|
87
|
+
|
88
|
+
API の中にはレスポンスに結果の続きを取得するための URL を含んでいるものがあります。
|
89
|
+
|
90
|
+
MyApiClient では、このような API を enumerable に扱うための `#pageable_get` というメソッドを用意しています。以下に例を示します。
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
class MyPaginationApiClient < ApplicationApiClient
|
94
|
+
endpoint 'https://example.com/v1'
|
95
|
+
|
96
|
+
# GET pagination?page=1
|
97
|
+
def pagination
|
98
|
+
pageable_get 'pagination', paging: '$.links.next', headers: headers, query: { page: 1 }
|
99
|
+
end
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
def headers
|
104
|
+
{ 'Content-Type': 'application/json;charset=UTF-8' }
|
105
|
+
end
|
106
|
+
end
|
107
|
+
```
|
108
|
+
|
109
|
+
上記の例の場合、最初に `GET https://example.com/v1/pagination?page=1` に対してリクエストが実行され、続けてレスポンス JSON の `$.link.next` に含まれる URL に対して enumerable にリクエストを実行します。
|
110
|
+
|
111
|
+
例えば以下のようなレスポンスであれば、`$.link.next` は `"https://example.com/pagination?page=3"` を示します。
|
112
|
+
|
113
|
+
```json
|
114
|
+
{
|
115
|
+
"links": {
|
116
|
+
"next": "https://example.com/pagination?page=3",
|
117
|
+
"previous": "https://example.com/pagination?page=1",
|
118
|
+
},
|
119
|
+
"page": 2
|
120
|
+
}
|
121
|
+
```
|
122
|
+
|
123
|
+
そして `#pageable_get` は [Enumerator::Lazy](https://docs.ruby-lang.org/ja/latest/class/Enumerator=3a=3aLazy.html) を返すので、 `#each` や `#next` を実行することで次の結果を取得できます。
|
124
|
+
|
125
|
+
```ruby
|
126
|
+
api_clinet = MyPaginationApiClient.new
|
127
|
+
api_clinet.pagination.each do |response|
|
128
|
+
# Do something.
|
129
|
+
end
|
130
|
+
|
131
|
+
p = api_clinet.pagination
|
132
|
+
p.next # => 1st page result
|
133
|
+
p.next # => 2nd page result
|
134
|
+
p.next # => 3rd page result
|
135
|
+
```
|
136
|
+
|
137
|
+
なお、`#each` はレスポンスに含まれる `paging` の値が nil になるまで繰り返されるのでご注意ください。例えば `#take` と組み合わせることでページネーションの上限を設定できます。
|
138
|
+
|
139
|
+
`#pageable_get` の alias として `#pget` も利用可能です。
|
140
|
+
|
141
|
+
```ruby
|
142
|
+
# GET pagination?page=1
|
143
|
+
def pagination
|
144
|
+
pget 'pagination', paging: '$.links.next', headers: headers, query: { page: 1 }
|
145
|
+
end
|
146
|
+
```
|
147
|
+
|
86
148
|
### Error handling
|
87
149
|
|
88
150
|
上記のコードにエラーハンドリングを追加してみます。
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'application_api_client'
|
4
|
+
|
5
|
+
# An usage example of the `my_api_client`.
|
6
|
+
# See also: my_api/app/controllers/pagination_controller.rb
|
7
|
+
class MyPaginationApiClient < ApplicationApiClient
|
8
|
+
# GET pagination?page=1
|
9
|
+
def pagination
|
10
|
+
pget 'pagination', paging: '$.links.next', headers: headers, query: { page: 1 }
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def headers
|
16
|
+
{ 'Content-Type': 'application/json;charset=UTF-8' }
|
17
|
+
end
|
18
|
+
end
|
@@ -29,8 +29,9 @@ module MyApiClient
|
|
29
29
|
# @option status_code [String, Range, Integer, Regexp]
|
30
30
|
# Verifies response HTTP status code and raises error if matched
|
31
31
|
# @option json [Hash, Symbol]
|
32
|
-
#
|
33
|
-
#
|
32
|
+
# Specify the validation target value path included in the response body
|
33
|
+
# as JsonPath expression.
|
34
|
+
# If specified `:forbid_nil`, it forbid `nil` at the response body.
|
34
35
|
# @option with [Symbol]
|
35
36
|
# Calls specified method when error detected
|
36
37
|
# @option raise [MyApiClient::Error]
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MyApiClient
|
4
|
+
module Request
|
5
|
+
# Provides basic HTTP request method.
|
6
|
+
module Basic
|
7
|
+
HTTP_METHODS = %i[get post patch delete].freeze
|
8
|
+
|
9
|
+
HTTP_METHODS.each do |http_method|
|
10
|
+
class_eval <<~METHOD, __FILE__, __LINE__ + 1
|
11
|
+
# Executes HTTP request with #{http_method.upcase} method
|
12
|
+
#
|
13
|
+
# @param pathname [String]
|
14
|
+
# Pathname of the request target URL.
|
15
|
+
# It's joined with the defined by `endpoint`.
|
16
|
+
# @param headers [Hash, nil]
|
17
|
+
# Request headers.
|
18
|
+
# @param query [Hash, nil]
|
19
|
+
# Query string.
|
20
|
+
# @param body [Hash, nil]
|
21
|
+
# Request body. You should not specify it when use GET method.
|
22
|
+
# @return [Sawyer::Resource]
|
23
|
+
# Response body instance.
|
24
|
+
def #{http_method}(pathname, headers: nil, query: nil, body: nil)
|
25
|
+
response = call(:_request_with_relative_uri, :#{http_method}, pathname, headers, query, body)
|
26
|
+
response.data
|
27
|
+
end
|
28
|
+
METHOD
|
29
|
+
end
|
30
|
+
|
31
|
+
alias put patch
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MyApiClient
|
4
|
+
module Request
|
5
|
+
# Provides enumerable HTTP request method.
|
6
|
+
module Pagination
|
7
|
+
# Executes HTTP request with GET method, for pagination API. Expects the
|
8
|
+
# pagination API to provide pagination links as part of the content of the response.
|
9
|
+
#
|
10
|
+
# @param pathname [String]
|
11
|
+
# Pathname of the request target URL. It's joined with the defined by `endpoint`.
|
12
|
+
# @param paging [String]
|
13
|
+
# Specify the pagination link path included in the response body as JsonPath expression
|
14
|
+
# @param headers [Hash, nil]
|
15
|
+
# Request headers.
|
16
|
+
# @param query [Hash, nil]
|
17
|
+
# Query string.
|
18
|
+
# @param body [Hash, nil]
|
19
|
+
# Request body. You should not specify it when use GET method.
|
20
|
+
# @return [Enumerator::Lazy]
|
21
|
+
# Yields the pagination API response.
|
22
|
+
def pageable_get(pathname, paging:, headers: nil, query: nil)
|
23
|
+
Enumerator.new do |y|
|
24
|
+
response = call(:_request_with_relative_uri, :get, pathname, headers, query, nil)
|
25
|
+
loop do
|
26
|
+
y << response.data
|
27
|
+
|
28
|
+
next_uri = JsonPath.new(paging).first(response.body)
|
29
|
+
break if next_uri.blank?
|
30
|
+
|
31
|
+
response = call(:_request_with_absolute_uri, :get, next_uri, headers, nil)
|
32
|
+
end
|
33
|
+
end.lazy
|
34
|
+
end
|
35
|
+
|
36
|
+
alias pget pageable_get
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -1,38 +1,35 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module MyApiClient
|
4
|
-
#
|
4
|
+
# Provides HTTP request method.
|
5
5
|
module Request
|
6
|
-
|
7
|
-
|
8
|
-
HTTP_METHODS.each do |http_method|
|
9
|
-
class_eval <<~METHOD, __FILE__, __LINE__ + 1
|
10
|
-
# Executes HTTP request with #{http_method.upcase} method
|
11
|
-
#
|
12
|
-
# @param pathname [String]
|
13
|
-
# Pathname of the request target URL.
|
14
|
-
# It's joined with the defined `endpoint`.
|
15
|
-
# @param headers [Hash, nil]
|
16
|
-
# Request headers.
|
17
|
-
# @param query [Hash, nil]
|
18
|
-
# Query string.
|
19
|
-
# @param body [Hash, nil]
|
20
|
-
# Request body. You should not specify it when use GET method.
|
21
|
-
# @return [Sawyer::Resouce]
|
22
|
-
# Response body instance.
|
23
|
-
def #{http_method}(pathname, headers: nil, query: nil, body: nil)
|
24
|
-
query_strings = query.present? ? '?' + query&.to_query : ''
|
25
|
-
uri = URI.join(File.join(endpoint, pathname), query_strings)
|
26
|
-
response = call(:_request, :#{http_method}, uri, headers, body)
|
27
|
-
response.data
|
28
|
-
end
|
29
|
-
METHOD
|
30
|
-
end
|
31
|
-
alias put patch
|
6
|
+
include Basic
|
7
|
+
include Pagination
|
32
8
|
|
33
9
|
private
|
34
10
|
|
35
|
-
# Executes HTTP request.
|
11
|
+
# Executes HTTP request with relative URI.
|
12
|
+
#
|
13
|
+
# @param http_method [Symbol]
|
14
|
+
# HTTP method. e.g. `:get`, `:post`, `:patch` and `:delete`.
|
15
|
+
# @param pathname [String]
|
16
|
+
# Pathname of the request target URL.
|
17
|
+
# It's joined with the defined by `endpoint`.
|
18
|
+
# @param headers [Hash, nil]
|
19
|
+
# Request headers.
|
20
|
+
# @param query [Hash, nil]
|
21
|
+
# Query string.
|
22
|
+
# @param body [Hash, nil]
|
23
|
+
# Request body.
|
24
|
+
# @return [Sawyer::Response]
|
25
|
+
# Response instance.
|
26
|
+
def _request_with_relative_uri(http_method, pathname, headers, query, body)
|
27
|
+
query_strings = query.present? ? '?' + query&.to_query : ''
|
28
|
+
uri = URI.join(File.join(endpoint, pathname), query_strings)
|
29
|
+
_request_with_absolute_uri(http_method, uri, headers, body)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Executes HTTP request with absolute URI.
|
36
33
|
#
|
37
34
|
# @param http_method [Symbol]
|
38
35
|
# HTTP method. e.g. `:get`, `:post`, `:patch` and `:delete`.
|
@@ -44,13 +41,11 @@ module MyApiClient
|
|
44
41
|
# Request body.
|
45
42
|
# @return [Sawyer::Response]
|
46
43
|
# Response instance.
|
47
|
-
def
|
48
|
-
request_params = Params::Request.new(http_method, uri, headers, body)
|
49
|
-
request_logger = Logger.new(logger, http_method, uri)
|
44
|
+
def _request_with_absolute_uri(http_method, uri, headers, body)
|
50
45
|
Executor.call(
|
51
46
|
instance: self,
|
52
|
-
request_params:
|
53
|
-
request_logger:
|
47
|
+
request_params: Params::Request.new(http_method, uri, headers, body),
|
48
|
+
request_logger: Logger.new(logger, http_method, uri),
|
54
49
|
faraday_options: faraday_options
|
55
50
|
)
|
56
51
|
end
|
data/lib/my_api_client.rb
CHANGED
@@ -16,6 +16,8 @@ require 'my_api_client/error_handling'
|
|
16
16
|
require 'my_api_client/exceptions'
|
17
17
|
require 'my_api_client/request/logger'
|
18
18
|
require 'my_api_client/request/executor'
|
19
|
+
require 'my_api_client/request/basic'
|
20
|
+
require 'my_api_client/request/pagination'
|
19
21
|
require 'my_api_client/errors'
|
20
22
|
require 'my_api_client/params/params'
|
21
23
|
require 'my_api_client/params/request'
|
data/my_api/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.7
|
1
|
+
2.5.7
|
data/my_api/Gemfile.lock
CHANGED
@@ -1,34 +1,34 @@
|
|
1
1
|
GEM
|
2
2
|
remote: https://rubygems.org/
|
3
3
|
specs:
|
4
|
-
actionmailer (6.0.2.
|
5
|
-
actionpack (= 6.0.2.
|
6
|
-
actionview (= 6.0.2.
|
7
|
-
activejob (= 6.0.2.
|
4
|
+
actionmailer (6.0.2.2)
|
5
|
+
actionpack (= 6.0.2.2)
|
6
|
+
actionview (= 6.0.2.2)
|
7
|
+
activejob (= 6.0.2.2)
|
8
8
|
mail (~> 2.5, >= 2.5.4)
|
9
9
|
rails-dom-testing (~> 2.0)
|
10
|
-
actionpack (6.0.2.
|
11
|
-
actionview (= 6.0.2.
|
12
|
-
activesupport (= 6.0.2.
|
10
|
+
actionpack (6.0.2.2)
|
11
|
+
actionview (= 6.0.2.2)
|
12
|
+
activesupport (= 6.0.2.2)
|
13
13
|
rack (~> 2.0, >= 2.0.8)
|
14
14
|
rack-test (>= 0.6.3)
|
15
15
|
rails-dom-testing (~> 2.0)
|
16
16
|
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
17
|
-
actionview (6.0.2.
|
18
|
-
activesupport (= 6.0.2.
|
17
|
+
actionview (6.0.2.2)
|
18
|
+
activesupport (= 6.0.2.2)
|
19
19
|
builder (~> 3.1)
|
20
20
|
erubi (~> 1.4)
|
21
21
|
rails-dom-testing (~> 2.0)
|
22
22
|
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
23
|
-
activejob (6.0.2.
|
24
|
-
activesupport (= 6.0.2.
|
23
|
+
activejob (6.0.2.2)
|
24
|
+
activesupport (= 6.0.2.2)
|
25
25
|
globalid (>= 0.3.6)
|
26
|
-
activemodel (6.0.2.
|
27
|
-
activesupport (= 6.0.2.
|
28
|
-
activerecord (6.0.2.
|
29
|
-
activemodel (= 6.0.2.
|
30
|
-
activesupport (= 6.0.2.
|
31
|
-
activesupport (6.0.2.
|
26
|
+
activemodel (6.0.2.2)
|
27
|
+
activesupport (= 6.0.2.2)
|
28
|
+
activerecord (6.0.2.2)
|
29
|
+
activemodel (= 6.0.2.2)
|
30
|
+
activesupport (= 6.0.2.2)
|
31
|
+
activesupport (6.0.2.2)
|
32
32
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
33
33
|
i18n (>= 0.7, < 2)
|
34
34
|
minitest (~> 5.1)
|
@@ -45,44 +45,44 @@ GEM
|
|
45
45
|
rainbow
|
46
46
|
thor
|
47
47
|
zeitwerk
|
48
|
-
aws-partitions (1.
|
49
|
-
aws-sdk-apigateway (1.
|
48
|
+
aws-partitions (1.285.0)
|
49
|
+
aws-sdk-apigateway (1.37.0)
|
50
50
|
aws-sdk-core (~> 3, >= 3.71.0)
|
51
51
|
aws-sigv4 (~> 1.1)
|
52
|
-
aws-sdk-cloudformation (1.
|
52
|
+
aws-sdk-cloudformation (1.31.0)
|
53
53
|
aws-sdk-core (~> 3, >= 3.71.0)
|
54
54
|
aws-sigv4 (~> 1.1)
|
55
|
-
aws-sdk-cloudwatchlogs (1.
|
55
|
+
aws-sdk-cloudwatchlogs (1.29.0)
|
56
56
|
aws-sdk-core (~> 3, >= 3.71.0)
|
57
57
|
aws-sigv4 (~> 1.1)
|
58
|
-
aws-sdk-core (3.
|
58
|
+
aws-sdk-core (3.91.1)
|
59
59
|
aws-eventstream (~> 1.0, >= 1.0.2)
|
60
60
|
aws-partitions (~> 1, >= 1.239.0)
|
61
61
|
aws-sigv4 (~> 1.1)
|
62
62
|
jmespath (~> 1.0)
|
63
|
-
aws-sdk-dynamodb (1.
|
63
|
+
aws-sdk-dynamodb (1.45.0)
|
64
64
|
aws-sdk-core (~> 3, >= 3.71.0)
|
65
65
|
aws-sigv4 (~> 1.1)
|
66
|
-
aws-sdk-kinesis (1.
|
66
|
+
aws-sdk-kinesis (1.21.0)
|
67
67
|
aws-sdk-core (~> 3, >= 3.71.0)
|
68
68
|
aws-sigv4 (~> 1.1)
|
69
|
-
aws-sdk-kms (1.
|
69
|
+
aws-sdk-kms (1.30.0)
|
70
70
|
aws-sdk-core (~> 3, >= 3.71.0)
|
71
71
|
aws-sigv4 (~> 1.1)
|
72
|
-
aws-sdk-lambda (1.
|
72
|
+
aws-sdk-lambda (1.37.0)
|
73
73
|
aws-sdk-core (~> 3, >= 3.71.0)
|
74
74
|
aws-sigv4 (~> 1.1)
|
75
|
-
aws-sdk-s3 (1.
|
75
|
+
aws-sdk-s3 (1.61.1)
|
76
76
|
aws-sdk-core (~> 3, >= 3.83.0)
|
77
77
|
aws-sdk-kms (~> 1)
|
78
78
|
aws-sigv4 (~> 1.1)
|
79
|
-
aws-sdk-sns (1.
|
79
|
+
aws-sdk-sns (1.22.0)
|
80
80
|
aws-sdk-core (~> 3, >= 3.71.0)
|
81
81
|
aws-sigv4 (~> 1.1)
|
82
|
-
aws-sdk-sqs (1.
|
82
|
+
aws-sdk-sqs (1.24.0)
|
83
83
|
aws-sdk-core (~> 3, >= 3.71.0)
|
84
84
|
aws-sigv4 (~> 1.1)
|
85
|
-
aws-sdk-ssm (1.
|
85
|
+
aws-sdk-ssm (1.73.0)
|
86
86
|
aws-sdk-core (~> 3, >= 3.71.0)
|
87
87
|
aws-sigv4 (~> 1.1)
|
88
88
|
aws-sigv4 (1.1.1)
|
@@ -118,7 +118,7 @@ GEM
|
|
118
118
|
hashie (4.1.0)
|
119
119
|
i18n (1.8.2)
|
120
120
|
concurrent-ruby (~> 1.0)
|
121
|
-
jets (2.3.
|
121
|
+
jets (2.3.14)
|
122
122
|
actionmailer (~> 6.0.0)
|
123
123
|
actionpack (~> 6.0.0)
|
124
124
|
actionview (~> 6.0.0)
|
@@ -154,7 +154,7 @@ GEM
|
|
154
154
|
text-table
|
155
155
|
thor
|
156
156
|
zeitwerk
|
157
|
-
jets-gems (0.2.
|
157
|
+
jets-gems (0.2.2)
|
158
158
|
gems
|
159
159
|
jets-html-sanitizer (1.0.4)
|
160
160
|
loofah (~> 2.2, >= 2.2.2)
|
@@ -169,13 +169,13 @@ GEM
|
|
169
169
|
mail (2.7.1)
|
170
170
|
mini_mime (>= 0.1.1)
|
171
171
|
memoist (0.16.2)
|
172
|
-
method_source (0.
|
172
|
+
method_source (1.0.0)
|
173
173
|
mimemagic (0.3.4)
|
174
174
|
mini_mime (1.0.2)
|
175
175
|
mini_portile2 (2.4.0)
|
176
176
|
minitest (5.14.0)
|
177
177
|
nio4r (2.5.2)
|
178
|
-
nokogiri (1.10.
|
178
|
+
nokogiri (1.10.9)
|
179
179
|
mini_portile2 (~> 2.4.0)
|
180
180
|
public_suffix (4.0.3)
|
181
181
|
puma (4.3.3)
|
@@ -188,15 +188,15 @@ GEM
|
|
188
188
|
nokogiri (>= 1.6)
|
189
189
|
rails-html-sanitizer (1.3.0)
|
190
190
|
loofah (~> 2.3)
|
191
|
-
railties (6.0.2.
|
192
|
-
actionpack (= 6.0.2.
|
193
|
-
activesupport (= 6.0.2.
|
191
|
+
railties (6.0.2.2)
|
192
|
+
actionpack (= 6.0.2.2)
|
193
|
+
activesupport (= 6.0.2.2)
|
194
194
|
method_source
|
195
195
|
rake (>= 0.8.7)
|
196
196
|
thor (>= 0.20.3, < 2.0)
|
197
197
|
rainbow (3.0.0)
|
198
198
|
rake (13.0.1)
|
199
|
-
recursive-open-struct (1.1.
|
199
|
+
recursive-open-struct (1.1.1)
|
200
200
|
regexp_parser (1.7.0)
|
201
201
|
rspec (3.9.0)
|
202
202
|
rspec-core (~> 3.9.0)
|
@@ -204,7 +204,7 @@ GEM
|
|
204
204
|
rspec-mocks (~> 3.9.0)
|
205
205
|
rspec-core (3.9.1)
|
206
206
|
rspec-support (~> 3.9.1)
|
207
|
-
rspec-expectations (3.9.
|
207
|
+
rspec-expectations (3.9.1)
|
208
208
|
diff-lcs (>= 1.2.0, < 2.0)
|
209
209
|
rspec-support (~> 3.9.0)
|
210
210
|
rspec-mocks (3.9.1)
|
@@ -222,7 +222,7 @@ GEM
|
|
222
222
|
thread_safe (~> 0.1)
|
223
223
|
xpath (3.2.0)
|
224
224
|
nokogiri (~> 1.8)
|
225
|
-
zeitwerk (2.
|
225
|
+
zeitwerk (2.3.0)
|
226
226
|
|
227
227
|
PLATFORMS
|
228
228
|
ruby
|
data/my_api/README.md
CHANGED
@@ -28,6 +28,12 @@ This API returns arbitrary error code as JSON.
|
|
28
28
|
|
29
29
|
* `GET error/:code`
|
30
30
|
|
31
|
+
### My Pagination API
|
32
|
+
|
33
|
+
This API returns a response including pagination links.
|
34
|
+
|
35
|
+
* `GET pagination?page=1`
|
36
|
+
|
31
37
|
## Deployment
|
32
38
|
|
33
39
|
You need to prepare following environment variables:
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# A Pagination API
|
4
|
+
class PaginationController < ApplicationController
|
5
|
+
# GET pagination
|
6
|
+
def index
|
7
|
+
case params[:page]
|
8
|
+
when '1', nil
|
9
|
+
render status: :ok, json: first_page
|
10
|
+
when '2'
|
11
|
+
render status: :ok, json: second_page
|
12
|
+
when '3'
|
13
|
+
render status: :ok, json: third_page
|
14
|
+
else
|
15
|
+
render status: :not_found, json: ''
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def first_page
|
22
|
+
{
|
23
|
+
links: {
|
24
|
+
next: page_link(2),
|
25
|
+
},
|
26
|
+
page: 1,
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def second_page
|
31
|
+
{
|
32
|
+
links: {
|
33
|
+
next: page_link(3),
|
34
|
+
previous: page_link(1),
|
35
|
+
},
|
36
|
+
page: 2,
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
def third_page
|
41
|
+
{
|
42
|
+
links: {
|
43
|
+
previous: page_link(2),
|
44
|
+
},
|
45
|
+
page: 3,
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
# NOTE: `#pagination_url` returns `http://xxxxx.execute-api.ap-northeast-1.amazonaws.com/pagination`
|
50
|
+
# but it should be `https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/pagination`.
|
51
|
+
# So this is workaround.
|
52
|
+
def page_link(page)
|
53
|
+
query_strings = '?' + { page: page }.to_query
|
54
|
+
uri = File.join(ENV['JETS_HOST'], ENV['JETS_STAGE'], pagination_path)
|
55
|
+
uri.sub!('http://', 'https://')
|
56
|
+
URI.join(uri, query_strings)
|
57
|
+
end
|
58
|
+
end
|
data/my_api/config/routes.rb
CHANGED
@@ -7,6 +7,7 @@ Jets.application.routes.draw do
|
|
7
7
|
|
8
8
|
get 'status/:status', to: 'status#show'
|
9
9
|
get 'error/:code', to: 'error#show'
|
10
|
+
get 'pagination', to: 'pagination#index'
|
10
11
|
|
11
12
|
# The jets/public#show controller can serve static utf8 content out of the public folder.
|
12
13
|
# Note, as part of the deploy process Jets uploads files in the public folder to s3
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe PaginationController, type: :controller do
|
4
|
+
describe '#index' do
|
5
|
+
let(:first_page) do
|
6
|
+
{
|
7
|
+
links: {
|
8
|
+
next: 'https://example.com/test/pagination?page=2',
|
9
|
+
},
|
10
|
+
page: 1,
|
11
|
+
}.to_json
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:second_page) do
|
15
|
+
{
|
16
|
+
links: {
|
17
|
+
next: 'https://example.com/test/pagination?page=3',
|
18
|
+
previous: 'https://example.com/test/pagination?page=1',
|
19
|
+
},
|
20
|
+
page: 2,
|
21
|
+
}.to_json
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:third_page) do
|
25
|
+
{
|
26
|
+
links: {
|
27
|
+
previous: 'https://example.com/test/pagination?page=2',
|
28
|
+
},
|
29
|
+
page: 3,
|
30
|
+
}.to_json
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'without page' do
|
34
|
+
it 'returns a 1st page contents including 2nd page link' do
|
35
|
+
get '/pagination'
|
36
|
+
expect(response.status).to eq 200
|
37
|
+
expect(response.body).to eq first_page
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'with page = 1' do
|
42
|
+
it 'returns a 1st page contents including 2nd page link' do
|
43
|
+
get '/pagination', page: 1
|
44
|
+
expect(response.status).to eq 200
|
45
|
+
expect(response.body).to eq first_page
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'with page = 2' do
|
50
|
+
it 'returns a 2nd page contents including 3rd page link' do
|
51
|
+
get '/pagination', page: 2
|
52
|
+
expect(response.status).to eq 200
|
53
|
+
expect(response.body).to eq second_page
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'with page = 3' do
|
58
|
+
it 'returns a 3rd page contents not including next page link' do
|
59
|
+
get '/pagination', page: 3
|
60
|
+
expect(response.status).to eq 200
|
61
|
+
expect(response.body).to eq third_page
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'with page = 4' do
|
66
|
+
it 'returns 404 NOT FOUND' do
|
67
|
+
get '/pagination', page: 4
|
68
|
+
expect(response.status).to eq 404
|
69
|
+
expect(response.body).to be_blank
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/my_api/spec/spec_helper.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
ENV['JETS_TEST'] = '1'
|
4
4
|
ENV['JETS_ENV'] ||= 'test'
|
5
|
+
ENV['JETS_STAGE'] ||= 'test'
|
5
6
|
# Ensures aws api never called. Fixture home folder does not contain ~/.aws/credentails
|
6
7
|
ENV['HOME'] = 'spec/fixtures/home'
|
7
8
|
|
@@ -24,3 +25,7 @@ end
|
|
24
25
|
RSpec.configure do |c|
|
25
26
|
c.include Helpers
|
26
27
|
end
|
28
|
+
|
29
|
+
Jets.application.configure do
|
30
|
+
config.helpers.host = 'https://example.com'
|
31
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: my_api_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ryz310
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-03-
|
11
|
+
date: 2020-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -248,6 +248,7 @@ files:
|
|
248
248
|
- example/api_clients/application_api_client.rb
|
249
249
|
- example/api_clients/my_error_api_client.rb
|
250
250
|
- example/api_clients/my_errors.rb
|
251
|
+
- example/api_clients/my_pagination_api_client.rb
|
251
252
|
- example/api_clients/my_rest_api_client.rb
|
252
253
|
- example/api_clients/my_status_api_client.rb
|
253
254
|
- gemfiles/rails_4.2.gemfile
|
@@ -275,8 +276,10 @@ files:
|
|
275
276
|
- lib/my_api_client/params/params.rb
|
276
277
|
- lib/my_api_client/params/request.rb
|
277
278
|
- lib/my_api_client/request.rb
|
279
|
+
- lib/my_api_client/request/basic.rb
|
278
280
|
- lib/my_api_client/request/executor.rb
|
279
281
|
- lib/my_api_client/request/logger.rb
|
282
|
+
- lib/my_api_client/request/pagination.rb
|
280
283
|
- lib/my_api_client/rspec.rb
|
281
284
|
- lib/my_api_client/rspec/matcher_helper.rb
|
282
285
|
- lib/my_api_client/rspec/matchers/be_handled_as_an_error.rb
|
@@ -297,6 +300,7 @@ files:
|
|
297
300
|
- my_api/Rakefile
|
298
301
|
- my_api/app/controllers/application_controller.rb
|
299
302
|
- my_api/app/controllers/error_controller.rb
|
303
|
+
- my_api/app/controllers/pagination_controller.rb
|
300
304
|
- my_api/app/controllers/rest_controller.rb
|
301
305
|
- my_api/app/controllers/status_controller.rb
|
302
306
|
- my_api/app/helpers/application_helper.rb
|
@@ -316,13 +320,13 @@ files:
|
|
316
320
|
- my_api/public/favicon.ico
|
317
321
|
- my_api/public/index.html
|
318
322
|
- my_api/spec/controllers/error_controller_spec.rb
|
323
|
+
- my_api/spec/controllers/pagination_controller_spec.rb
|
319
324
|
- my_api/spec/controllers/rest_controller_spec.rb
|
320
325
|
- my_api/spec/controllers/status_controller_spec.rb
|
321
326
|
- my_api/spec/fixtures/payloads/posts-index.json
|
322
327
|
- my_api/spec/fixtures/payloads/posts-show.json
|
323
328
|
- my_api/spec/spec_helper.rb
|
324
329
|
- my_api_client.gemspec
|
325
|
-
- renovate.json
|
326
330
|
homepage: https://github.com/ryz310/my_api_client
|
327
331
|
licenses:
|
328
332
|
- MIT
|
data/renovate.json
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"extends": [
|
3
|
-
"config:base"
|
4
|
-
],
|
5
|
-
"packageRules": [
|
6
|
-
{
|
7
|
-
"updateTypes": ["major"],
|
8
|
-
"labels": ["renovate", "major"]
|
9
|
-
},
|
10
|
-
{
|
11
|
-
"updateTypes": ["minor"],
|
12
|
-
"labels": ["renovate", "minor", "auto merge"],
|
13
|
-
"automerge": true
|
14
|
-
},
|
15
|
-
{
|
16
|
-
"updateTypes": ["patch"],
|
17
|
-
"labels": ["renovate", "patch", "auto merge"],
|
18
|
-
"automerge": true
|
19
|
-
}
|
20
|
-
]
|
21
|
-
}
|