my_api_client 0.20.0 → 0.23.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/.circleci/config.yml +34 -18
- data/.github/dependabot.yml +32 -0
- data/.rubocop.yml +10 -10
- data/.rubocop_todo.yml +2 -2
- data/CHANGELOG.md +215 -249
- data/Gemfile.lock +54 -57
- data/README.jp.md +36 -34
- data/README.md +391 -8
- data/example/api_clients/application_api_client.rb +1 -1
- data/gemfiles/rails_5.0.gemfile +1 -0
- data/gemfiles/rails_5.1.gemfile +1 -0
- data/gemfiles/rails_5.2.gemfile +1 -0
- data/gemfiles/rails_6.0.gemfile +1 -0
- data/gemfiles/rails_7.0.gemfile +15 -0
- data/lib/generators/rails/templates/api_client.rb.erb +3 -5
- data/lib/generators/rspec/templates/api_client_spec.rb.erb +0 -8
- data/lib/my_api_client/errors/network_error.rb +3 -3
- data/lib/my_api_client/errors.rb +2 -2
- data/lib/my_api_client/integrations/bugsnag.rb +2 -2
- data/lib/my_api_client/rspec/matchers/be_handled_as_an_error.rb +3 -3
- data/lib/my_api_client/rspec/stub.rb +11 -7
- data/lib/my_api_client/version.rb +1 -1
- data/my_api/Gemfile +1 -1
- data/my_api/Gemfile.lock +100 -99
- data/my_api/app/controllers/pagination_controller.rb +1 -1
- data/my_api/public/index.html +2 -2
- data/my_api/spec/spec_helper.rb +1 -1
- data/my_api_client.gemspec +4 -1
- data/rails_app/rails_5.2/Gemfile.lock +70 -64
- data/rails_app/rails_6.0/Gemfile +1 -0
- data/rails_app/rails_6.0/Gemfile.lock +92 -94
- data/rails_app/rails_6.1/Gemfile +2 -2
- data/rails_app/rails_6.1/Gemfile.lock +91 -95
- data/rails_app/rails_6.1/Rakefile +3 -1
- data/rails_app/rails_6.1/bin/bundle +28 -20
- data/rails_app/rails_6.1/bin/rails +4 -2
- data/rails_app/rails_6.1/bin/rake +4 -2
- data/rails_app/rails_6.1/bin/setup +3 -1
- data/rails_app/rails_6.1/config.ru +3 -1
- data/rails_app/rails_7.0/Gemfile +13 -0
- data/rails_app/rails_7.0/Gemfile.lock +210 -0
- data/rails_app/rails_7.0/README.md +24 -0
- data/rails_app/rails_7.0/Rakefile +8 -0
- data/rails_app/rails_7.0/app/controllers/application_controller.rb +4 -0
- data/rails_app/rails_7.0/app/models/application_record.rb +5 -0
- data/rails_app/rails_7.0/bin/bundle +122 -0
- data/rails_app/rails_7.0/bin/rails +6 -0
- data/rails_app/rails_7.0/bin/rake +6 -0
- data/rails_app/rails_7.0/bin/setup +35 -0
- data/rails_app/rails_7.0/config/application.rb +41 -0
- data/rails_app/rails_7.0/config/boot.rb +5 -0
- data/rails_app/rails_7.0/config/credentials.yml.enc +1 -0
- data/rails_app/rails_7.0/config/database.yml +25 -0
- data/rails_app/rails_7.0/config/environment.rb +7 -0
- data/rails_app/rails_7.0/config/environments/development.rb +58 -0
- data/rails_app/rails_7.0/config/environments/production.rb +70 -0
- data/rails_app/rails_7.0/config/environments/test.rb +52 -0
- data/rails_app/rails_7.0/config/initializers/cors.rb +17 -0
- data/rails_app/rails_7.0/config/initializers/filter_parameter_logging.rb +8 -0
- data/rails_app/rails_7.0/config/initializers/inflections.rb +17 -0
- data/rails_app/rails_7.0/config/locales/en.yml +33 -0
- data/rails_app/rails_7.0/config/routes.rb +8 -0
- data/rails_app/rails_7.0/config.ru +8 -0
- data/rails_app/rails_7.0/db/seeds.rb +8 -0
- data/rails_app/rails_7.0/public/robots.txt +1 -0
- data/rails_app/rails_7.0/spec/rails_helper.rb +14 -0
- data/rails_app/rails_7.0/spec/spec_helper.rb +13 -0
- metadata +36 -6
- data/.dependabot/config.yml +0 -34
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.23.0)
|
5
5
|
activesupport (>= 5.2.0)
|
6
6
|
faraday (>= 0.17.1)
|
7
7
|
jsonpath
|
@@ -10,40 +10,37 @@ PATH
|
|
10
10
|
GEM
|
11
11
|
remote: https://rubygems.org/
|
12
12
|
specs:
|
13
|
-
activesupport (
|
13
|
+
activesupport (7.0.3)
|
14
14
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
15
15
|
i18n (>= 1.6, < 2)
|
16
16
|
minitest (>= 5.1)
|
17
17
|
tzinfo (~> 2.0)
|
18
|
-
|
19
|
-
addressable (2.7.0)
|
18
|
+
addressable (2.8.0)
|
20
19
|
public_suffix (>= 2.0.2, < 5.0)
|
21
20
|
ast (2.4.2)
|
22
|
-
bugsnag (6.
|
21
|
+
bugsnag (6.24.2)
|
23
22
|
concurrent-ruby (~> 1.0)
|
24
23
|
byebug (11.1.3)
|
25
24
|
coderay (1.1.3)
|
26
|
-
concurrent-ruby (1.1.
|
25
|
+
concurrent-ruby (1.1.10)
|
27
26
|
crack (0.4.5)
|
28
27
|
rexml
|
29
|
-
diff-lcs (1.
|
30
|
-
docile (1.
|
31
|
-
faraday (
|
32
|
-
faraday-net_http (~>
|
33
|
-
|
34
|
-
|
35
|
-
faraday-net_http (1.0.1)
|
28
|
+
diff-lcs (1.5.0)
|
29
|
+
docile (1.4.0)
|
30
|
+
faraday (2.3.0)
|
31
|
+
faraday-net_http (~> 2.0)
|
32
|
+
ruby2_keywords (>= 0.0.4)
|
33
|
+
faraday-net_http (2.0.3)
|
36
34
|
hashdiff (1.0.1)
|
37
|
-
i18n (1.
|
35
|
+
i18n (1.10.0)
|
38
36
|
concurrent-ruby (~> 1.0)
|
39
|
-
jsonpath (1.1.
|
37
|
+
jsonpath (1.1.2)
|
40
38
|
multi_json
|
41
39
|
method_source (1.0.0)
|
42
|
-
minitest (5.
|
40
|
+
minitest (5.15.0)
|
43
41
|
multi_json (1.15.0)
|
44
|
-
|
45
|
-
|
46
|
-
parser (3.0.0.0)
|
42
|
+
parallel (1.22.1)
|
43
|
+
parser (3.1.2.0)
|
47
44
|
ast (~> 2.4.1)
|
48
45
|
pry (0.13.1)
|
49
46
|
coderay (~> 1.1)
|
@@ -51,63 +48,63 @@ GEM
|
|
51
48
|
pry-byebug (3.9.0)
|
52
49
|
byebug (~> 11.0)
|
53
50
|
pry (~> 0.13.0)
|
54
|
-
public_suffix (4.0.
|
55
|
-
rainbow (3.
|
56
|
-
rake (13.0.
|
57
|
-
regexp_parser (2.
|
58
|
-
rexml (3.2.
|
59
|
-
rspec (3.
|
60
|
-
rspec-core (~> 3.
|
61
|
-
rspec-expectations (~> 3.
|
62
|
-
rspec-mocks (~> 3.
|
63
|
-
rspec-core (3.
|
64
|
-
rspec-support (~> 3.
|
65
|
-
rspec-expectations (3.
|
51
|
+
public_suffix (4.0.7)
|
52
|
+
rainbow (3.1.1)
|
53
|
+
rake (13.0.6)
|
54
|
+
regexp_parser (2.5.0)
|
55
|
+
rexml (3.2.5)
|
56
|
+
rspec (3.11.0)
|
57
|
+
rspec-core (~> 3.11.0)
|
58
|
+
rspec-expectations (~> 3.11.0)
|
59
|
+
rspec-mocks (~> 3.11.0)
|
60
|
+
rspec-core (3.11.0)
|
61
|
+
rspec-support (~> 3.11.0)
|
62
|
+
rspec-expectations (3.11.0)
|
66
63
|
diff-lcs (>= 1.2.0, < 2.0)
|
67
|
-
rspec-support (~> 3.
|
68
|
-
rspec-mocks (3.
|
64
|
+
rspec-support (~> 3.11.0)
|
65
|
+
rspec-mocks (3.11.1)
|
69
66
|
diff-lcs (>= 1.2.0, < 2.0)
|
70
|
-
rspec-support (~> 3.
|
71
|
-
rspec-support (3.
|
72
|
-
rspec_junit_formatter (0.
|
67
|
+
rspec-support (~> 3.11.0)
|
68
|
+
rspec-support (3.11.0)
|
69
|
+
rspec_junit_formatter (0.5.1)
|
73
70
|
rspec-core (>= 2, < 4, != 2.12.0)
|
74
|
-
rubocop (1.
|
71
|
+
rubocop (1.30.1)
|
75
72
|
parallel (~> 1.10)
|
76
|
-
parser (>= 3.
|
73
|
+
parser (>= 3.1.0.0)
|
77
74
|
rainbow (>= 2.2.2, < 4.0)
|
78
75
|
regexp_parser (>= 1.8, < 3.0)
|
79
|
-
rexml
|
80
|
-
rubocop-ast (>= 1.
|
76
|
+
rexml (>= 3.2.5, < 4.0)
|
77
|
+
rubocop-ast (>= 1.18.0, < 2.0)
|
81
78
|
ruby-progressbar (~> 1.7)
|
82
79
|
unicode-display_width (>= 1.4.0, < 3.0)
|
83
|
-
rubocop-ast (1.
|
84
|
-
parser (>=
|
85
|
-
rubocop-performance (1.
|
86
|
-
rubocop (>=
|
80
|
+
rubocop-ast (1.18.0)
|
81
|
+
parser (>= 3.1.1.0)
|
82
|
+
rubocop-performance (1.14.2)
|
83
|
+
rubocop (>= 1.7.0, < 2.0)
|
87
84
|
rubocop-ast (>= 0.4.0)
|
88
|
-
rubocop-rspec (2.
|
89
|
-
rubocop (~> 1.
|
90
|
-
rubocop-ast (>= 1.1.0)
|
85
|
+
rubocop-rspec (2.11.1)
|
86
|
+
rubocop (~> 1.19)
|
91
87
|
ruby-progressbar (1.11.0)
|
92
|
-
ruby2_keywords (0.0.
|
93
|
-
sawyer (0.
|
88
|
+
ruby2_keywords (0.0.5)
|
89
|
+
sawyer (0.9.2)
|
94
90
|
addressable (>= 2.3.5)
|
95
|
-
faraday (
|
91
|
+
faraday (>= 0.17.3, < 3)
|
96
92
|
simplecov (0.21.2)
|
97
93
|
docile (~> 1.1)
|
98
94
|
simplecov-html (~> 0.11)
|
99
95
|
simplecov_json_formatter (~> 0.1)
|
100
96
|
simplecov-html (0.12.3)
|
101
|
-
simplecov_json_formatter (0.1.
|
97
|
+
simplecov_json_formatter (0.1.4)
|
102
98
|
tzinfo (2.0.4)
|
103
99
|
concurrent-ruby (~> 1.0)
|
104
|
-
unicode-display_width (2.
|
105
|
-
webmock (3.
|
106
|
-
addressable (>= 2.
|
100
|
+
unicode-display_width (2.1.0)
|
101
|
+
webmock (3.14.0)
|
102
|
+
addressable (>= 2.8.0)
|
107
103
|
crack (>= 0.3.2)
|
108
104
|
hashdiff (>= 0.4.0, < 2.0.0)
|
109
|
-
|
110
|
-
|
105
|
+
webrick (1.7.0)
|
106
|
+
yard (0.9.28)
|
107
|
+
webrick (~> 1.7.0)
|
111
108
|
|
112
109
|
PLATFORMS
|
113
110
|
ruby
|
@@ -128,4 +125,4 @@ DEPENDENCIES
|
|
128
125
|
yard
|
129
126
|
|
130
127
|
BUNDLED WITH
|
131
|
-
2.
|
128
|
+
2.3.11
|
data/README.jp.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
# MyApiClient
|
4
4
|
|
5
|
-
MyApiClient は API リクエストクラスを作成するための汎用的な機能を提供します。Sawyer や Faraday をベースにエラーハンドリングの機能を強化した構造になっています。
|
5
|
+
MyApiClient は API リクエストクラスを作成するための汎用的な機能を提供します。[Sawyer](https://github.com/lostisland/sawyer) や [Faraday](https://github.com/lostisland/faraday) をベースにエラーハンドリングの機能を強化した構造になっています。
|
6
6
|
|
7
7
|
ただし、 Sawyer はダミーデータの作成が難しかったり、他の gem で競合することがよくあるので、将来的には依存しないように変更していくかもしれません。
|
8
8
|
|
@@ -12,12 +12,12 @@ MyApiClient は API リクエストクラスを作成するための汎用的な
|
|
12
12
|
|
13
13
|
## Supported Versions
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
- Ruby 2.7, 3.0, 3.1
|
16
|
+
- Rails 5.2, 6.0, 6.1, 7.0
|
17
17
|
|
18
18
|
## Installation
|
19
19
|
|
20
|
-
|
20
|
+
`my_api_client` を Gemfile に追加して下さい:
|
21
21
|
|
22
22
|
```ruby
|
23
23
|
gem 'my_api_client'
|
@@ -116,7 +116,7 @@ end
|
|
116
116
|
{
|
117
117
|
"links": {
|
118
118
|
"next": "https://example.com/pagination?page=3",
|
119
|
-
"previous": "https://example.com/pagination?page=1"
|
119
|
+
"previous": "https://example.com/pagination?page=1"
|
120
120
|
},
|
121
121
|
"page": 2
|
122
122
|
}
|
@@ -130,13 +130,13 @@ api_clinet.pagination.each do |response|
|
|
130
130
|
# Do something.
|
131
131
|
end
|
132
132
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
133
|
+
result = api_clinet.pagination
|
134
|
+
result.next # => 1st page result
|
135
|
+
result.next # => 2nd page result
|
136
|
+
result.next # => 3rd page result
|
137
137
|
```
|
138
138
|
|
139
|
-
なお、`#each` はレスポンスに含まれる `paging` の値が nil になるまで繰り返されるのでご注意ください。例えば `#take` と組み合わせることでページネーションの上限を設定できます。
|
139
|
+
なお、`#each` はレスポンスに含まれる `paging` の値が `nil` になるまで繰り返されるのでご注意ください。例えば `#take` と組み合わせることでページネーションの上限を設定できます。
|
140
140
|
|
141
141
|
`#pageable_get` の alias として `#pget` も利用可能です。
|
142
142
|
|
@@ -200,24 +200,24 @@ error_handling status_code: 500..599, raise: MyApiClient::ServerError do |_param
|
|
200
200
|
end
|
201
201
|
```
|
202
202
|
|
203
|
-
上記の例であれば、ステータスコードが `500..599` の場合に `MyApiClient::ServerError`
|
203
|
+
上記の例であれば、ステータスコードが `500..599` の場合に `MyApiClient::ServerError` を発生させる前に `block` の内容が実行れます。引数の `params` にはリクエスト情報とレスポンス情報が含まれています。`logger` はログ出力用インスタンスですが、このインスタンスを使ってログ出力すると、以下のようにリクエスト情報がログ出力に含まれるようになり、デバッグの際に便利です。
|
204
204
|
|
205
205
|
```text
|
206
206
|
API request `GET https://example.com/path/to/resouce`: "Server error occurred."
|
207
207
|
```
|
208
208
|
|
209
|
+
`json` には `Hash` の Key に [JSONPath](https://goessner.net/articles/JsonPath/) を指定して、レスポンス JSON から任意の値を取得し、 Value とマッチするかどうかでエラーハンドリングできます。Value には `String` `Integer` `Range` `Regexp` が指定可能です。上記の場合であれば、以下のような JSON にマッチします。
|
210
|
+
|
209
211
|
```ruby
|
210
212
|
error_handling json: { '$.errors.code': 10..19 }, with: :my_error_handling
|
211
213
|
```
|
212
214
|
|
213
|
-
`json` には `Hash` の Key に [JSONPath](https://goessner.net/articles/JsonPath/) を指定して、レスポンス JSON から任意の値を取得し、 Value とマッチするかどうかでエラーハンドリングできます。Value には `String` `Integer` `Range` `Regexp` が指定可能です。上記の場合であれば、以下のような JSON にマッチします。
|
214
|
-
|
215
215
|
```json
|
216
216
|
{
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
217
|
+
"erros": {
|
218
|
+
"code": 10,
|
219
|
+
"message": "Some error has occurred."
|
220
|
+
}
|
221
221
|
}
|
222
222
|
```
|
223
223
|
|
@@ -253,10 +253,10 @@ error_handling json: { '$.errors.code': :negative? }
|
|
253
253
|
|
254
254
|
```json
|
255
255
|
{
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
256
|
+
"erros": {
|
257
|
+
"code": -1,
|
258
|
+
"message": "Some error has occurred."
|
259
|
+
}
|
260
260
|
}
|
261
261
|
```
|
262
262
|
|
@@ -344,8 +344,8 @@ error_handling json: { '$.errors.code': 20 },
|
|
344
344
|
|
345
345
|
`retry` オプションを使用する際は以下の点に注意が必要です。
|
346
346
|
|
347
|
-
|
348
|
-
|
347
|
+
- `error_handling` に `raise` オプションの指定が必須となります。
|
348
|
+
- Block を使った `error_handling` の定義は禁止されます。
|
349
349
|
|
350
350
|
#### MyApiClient::NetworkError
|
351
351
|
|
@@ -630,14 +630,15 @@ stub_api_client_all(ExampleApiClient, request: { raise: MyApiClient::Error })
|
|
630
630
|
expect { execute_api_request }.to raise_error(MyApiClient::Error)
|
631
631
|
```
|
632
632
|
|
633
|
-
|
633
|
+
なお、発生した例外に含まれるレスポンスパラメータやステータスコードもスタブ化したい場合は、 `response` オプションと同時に指定することが可能です。
|
634
634
|
|
635
635
|
```ruby
|
636
636
|
stub_api_client_all(
|
637
637
|
ExampleApiClient,
|
638
638
|
request: {
|
639
639
|
raise: MyApiClient::Error,
|
640
|
-
response: { message: 'error' }
|
640
|
+
response: { message: 'error' },
|
641
|
+
status_code: 429
|
641
642
|
}
|
642
643
|
)
|
643
644
|
|
@@ -646,12 +647,14 @@ begin
|
|
646
647
|
rescue MyApiClient::Error => e
|
647
648
|
response_body = e.params.response.data.to_h
|
648
649
|
expect(response_body).to eq(message: 'error')
|
650
|
+
status_code = e.params.response.status
|
651
|
+
expect(status_code).to eq(429)
|
649
652
|
end
|
650
653
|
```
|
651
654
|
|
652
655
|
#### `pageable` option
|
653
656
|
|
654
|
-
`#pageable_get`
|
657
|
+
`#pageable_get` (`#pget`) を使った実装用に `pageable` というオプションが利用できます。
|
655
658
|
`pageable` に設定する値は `Enumerable` である必要があります。
|
656
659
|
|
657
660
|
```ruby
|
@@ -671,7 +674,7 @@ MyPaginationApiClient.new.pagination.each do |response|
|
|
671
674
|
end
|
672
675
|
```
|
673
676
|
|
674
|
-
なお、 `Enumerable` の各値にはここまで紹介した `response`, `raise`, `
|
677
|
+
なお、 `Enumerable` の各値にはここまで紹介した `response`, `raise`, `Proc` など全てのオプションが利用可能です。
|
675
678
|
|
676
679
|
```ruby
|
677
680
|
stub_api_client_all(
|
@@ -689,7 +692,6 @@ stub_api_client_all(
|
|
689
692
|
|
690
693
|
また、 `Enumerator` を使えば無限に続くページネーションを定義することもできます。
|
691
694
|
|
692
|
-
|
693
695
|
```ruby
|
694
696
|
stub_api_client_all(
|
695
697
|
MyPaginationApiClient,
|
@@ -739,10 +741,10 @@ $ gem_comet release {VERSION}
|
|
739
741
|
|
740
742
|
実行すると、 https://github.com/ryz310/my_api_client/pulls に以下のような PR が作成されます。
|
741
743
|
|
742
|
-
|
743
|
-
|
744
|
+
- [Update v0\.16\.1](https://github.com/ryz310/my_api_client/pull/297)
|
745
|
+
- [Release v0\.16\.1](https://github.com/ryz310/my_api_client/pull/298)
|
744
746
|
|
745
|
-
まず、 `Update v{VERSION}`
|
747
|
+
まず、 `Update v{VERSION}` という PR から merge に取り掛かります。
|
746
748
|
|
747
749
|
PR のコメントにも TODO が記載されていますが、まず、バージョン番号が正しく採番されているかを確認します。
|
748
750
|
|
@@ -752,12 +754,12 @@ See: [314a4c0](https://github.com/ryz310/my_api_client/pull/297/commits/314a4c06
|
|
752
754
|
|
753
755
|
See: [33a2d17](https://github.com/ryz310/my_api_client/pull/297/commits/33a2d1703c773813c837e74ee3181906b2f2e502)
|
754
756
|
|
755
|
-
これらが整ったら、 `Update v{VERSION}`
|
757
|
+
これらが整ったら、 `Update v{VERSION}` を merge します。
|
756
758
|
|
757
|
-
これでリリース準備が整ったので、`Release v{VERSION}`
|
759
|
+
これでリリース準備が整ったので、`Release v{VERSION}` の merge に取り掛かります。
|
758
760
|
|
759
761
|
この PR にこれからリリースする gem に対する変更が全て載っています。
|
760
|
-
変更内容の最終確認をして、 CI も通ったことを確認したら `Release v{VERSION}`
|
762
|
+
変更内容の最終確認をして、 CI も通ったことを確認したら `Release v{VERSION}` を merge します。
|
761
763
|
|
762
764
|
あとは Circle CI 側で gem のリリースが自動実行されるので、暫く待ちましょう。
|
763
765
|
|