my_api_client 0.13.0 → 0.16.1

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.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +102 -36
  3. data/.dependabot/config.yml +34 -0
  4. data/.envrc.skeleton +1 -0
  5. data/.rubocop.yml +8 -10
  6. data/.rubocop_challenge.yml +3 -0
  7. data/.rubocop_todo.yml +5 -10
  8. data/CHANGELOG.md +229 -0
  9. data/Gemfile.lock +48 -43
  10. data/README.jp.md +98 -23
  11. data/bin/console +4 -0
  12. data/example/api_clients/application_api_client.rb +13 -0
  13. data/example/api_clients/my_error_api_client.rb +34 -0
  14. data/example/api_clients/my_errors.rb +27 -0
  15. data/example/api_clients/my_pagination_api_client.rb +18 -0
  16. data/example/api_clients/my_rest_api_client.rb +48 -0
  17. data/example/api_clients/my_status_api_client.rb +22 -0
  18. data/lib/generators/rails/templates/application_api_client.rb.erb +0 -11
  19. data/lib/my_api_client.rb +10 -2
  20. data/lib/my_api_client/base.rb +2 -18
  21. data/lib/my_api_client/config.rb +0 -29
  22. data/lib/my_api_client/default_error_handlers.rb +64 -0
  23. data/lib/my_api_client/error_handling.rb +13 -23
  24. data/lib/my_api_client/error_handling/generator.rb +30 -10
  25. data/lib/my_api_client/error_handling/{process_retry_option.rb → retry_option_processor.rb} +1 -1
  26. data/lib/my_api_client/errors.rb +0 -53
  27. data/lib/my_api_client/errors/api_limit_error.rb +6 -0
  28. data/lib/my_api_client/errors/client_error.rb +93 -0
  29. data/lib/my_api_client/errors/network_error.rb +43 -0
  30. data/lib/my_api_client/errors/server_error.rb +42 -0
  31. data/lib/my_api_client/params/request.rb +7 -10
  32. data/lib/my_api_client/request.rb +48 -70
  33. data/lib/my_api_client/request/basic.rb +32 -0
  34. data/lib/my_api_client/request/executor.rb +89 -0
  35. data/lib/my_api_client/request/logger.rb +37 -0
  36. data/lib/my_api_client/request/pagination.rb +39 -0
  37. data/lib/my_api_client/rspec/matcher_helper.rb +2 -2
  38. data/lib/my_api_client/rspec/matchers/be_handled_as_an_error.rb +2 -0
  39. data/lib/my_api_client/rspec/matchers/request_to.rb +3 -4
  40. data/lib/my_api_client/version.rb +1 -1
  41. data/my_api/.envrc.skeleton +3 -0
  42. data/my_api/.gitignore +14 -0
  43. data/my_api/.jetskeep +1 -0
  44. data/my_api/.rspec +3 -0
  45. data/my_api/.ruby-version +1 -0
  46. data/my_api/Gemfile +23 -0
  47. data/my_api/Gemfile.lock +243 -0
  48. data/my_api/Procfile +7 -0
  49. data/my_api/README.md +54 -0
  50. data/my_api/Rakefile +4 -0
  51. data/my_api/app/controllers/application_controller.rb +5 -0
  52. data/my_api/app/controllers/error_controller.rb +21 -0
  53. data/my_api/app/controllers/pagination_controller.rb +58 -0
  54. data/my_api/app/controllers/rest_controller.rb +60 -0
  55. data/my_api/app/controllers/status_controller.rb +11 -0
  56. data/my_api/app/helpers/application_helper.rb +5 -0
  57. data/my_api/app/jobs/application_job.rb +7 -0
  58. data/my_api/app/models/application_item.rb +5 -0
  59. data/my_api/config.ru +7 -0
  60. data/my_api/config/application.rb +73 -0
  61. data/my_api/config/dynamodb.yml +22 -0
  62. data/my_api/config/environments/development.rb +9 -0
  63. data/my_api/config/environments/production.rb +11 -0
  64. data/my_api/config/environments/test.rb +9 -0
  65. data/my_api/config/routes.rb +17 -0
  66. data/my_api/db/.gitkeep +0 -0
  67. data/my_api/public/404.html +67 -0
  68. data/my_api/public/422.html +67 -0
  69. data/my_api/public/500.html +66 -0
  70. data/my_api/public/favicon.ico +0 -0
  71. data/my_api/public/index.html +91 -0
  72. data/my_api/spec/controllers/error_controller_spec.rb +43 -0
  73. data/my_api/spec/controllers/pagination_controller_spec.rb +73 -0
  74. data/my_api/spec/controllers/rest_controller_spec.rb +99 -0
  75. data/my_api/spec/controllers/status_controller_spec.rb +47 -0
  76. data/my_api/spec/fixtures/payloads/posts-index.json +51 -0
  77. data/my_api/spec/fixtures/payloads/posts-show.json +53 -0
  78. data/my_api/spec/spec_helper.rb +31 -0
  79. data/my_api_client.gemspec +1 -1
  80. metadata +62 -9
  81. data/lib/my_api_client/logger.rb +0 -36
  82. data/renovate.json +0 -5
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- my_api_client (0.13.0)
4
+ my_api_client (0.16.1)
5
5
  activesupport (>= 4.2.0)
6
6
  faraday (>= 0.17.1)
7
7
  jsonpath
@@ -10,75 +10,80 @@ PATH
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- activesupport (5.2.4.1)
13
+ activesupport (5.2.4.3)
14
14
  concurrent-ruby (~> 1.0, >= 1.0.2)
15
15
  i18n (>= 0.7, < 2)
16
16
  minitest (~> 5.1)
17
17
  tzinfo (~> 1.1)
18
18
  addressable (2.7.0)
19
19
  public_suffix (>= 2.0.2, < 5.0)
20
- ast (2.4.0)
21
- bugsnag (6.12.2)
20
+ ast (2.4.1)
21
+ bugsnag (6.16.0)
22
22
  concurrent-ruby (~> 1.0)
23
- byebug (11.1.0)
24
- coderay (1.1.2)
25
- concurrent-ruby (1.1.5)
23
+ byebug (11.1.3)
24
+ coderay (1.1.3)
25
+ concurrent-ruby (1.1.7)
26
26
  crack (0.4.3)
27
27
  safe_yaml (~> 1.0.0)
28
- diff-lcs (1.3)
28
+ diff-lcs (1.4.4)
29
29
  docile (1.3.2)
30
- faraday (1.0.0)
30
+ faraday (1.0.1)
31
31
  multipart-post (>= 1.2, < 3)
32
- hashdiff (1.0.0)
33
- i18n (1.8.2)
32
+ hashdiff (1.0.1)
33
+ i18n (1.8.5)
34
34
  concurrent-ruby (~> 1.0)
35
- jaro_winkler (1.5.4)
36
- json (2.3.0)
35
+ json (2.3.1)
37
36
  jsonpath (1.0.5)
38
37
  multi_json
39
38
  to_regexp (~> 0.2.1)
40
- method_source (0.9.2)
41
- minitest (5.14.0)
42
- multi_json (1.14.1)
39
+ method_source (1.0.0)
40
+ minitest (5.14.1)
41
+ multi_json (1.15.0)
43
42
  multipart-post (2.1.1)
44
- parallel (1.19.1)
45
- parser (2.7.0.2)
46
- ast (~> 2.4.0)
47
- pry (0.12.2)
48
- coderay (~> 1.1.0)
49
- method_source (~> 0.9.0)
50
- pry-byebug (3.7.0)
43
+ parallel (1.19.2)
44
+ parser (2.7.1.4)
45
+ ast (~> 2.4.1)
46
+ pry (0.13.1)
47
+ coderay (~> 1.1)
48
+ method_source (~> 1.0)
49
+ pry-byebug (3.9.0)
51
50
  byebug (~> 11.0)
52
- pry (~> 0.10)
53
- public_suffix (4.0.3)
51
+ pry (~> 0.13.0)
52
+ public_suffix (4.0.5)
54
53
  rainbow (3.0.0)
55
54
  rake (13.0.1)
55
+ regexp_parser (1.7.1)
56
+ rexml (3.2.4)
56
57
  rspec (3.9.0)
57
58
  rspec-core (~> 3.9.0)
58
59
  rspec-expectations (~> 3.9.0)
59
60
  rspec-mocks (~> 3.9.0)
60
- rspec-core (3.9.1)
61
- rspec-support (~> 3.9.1)
62
- rspec-expectations (3.9.0)
61
+ rspec-core (3.9.2)
62
+ rspec-support (~> 3.9.3)
63
+ rspec-expectations (3.9.2)
63
64
  diff-lcs (>= 1.2.0, < 2.0)
64
65
  rspec-support (~> 3.9.0)
65
66
  rspec-mocks (3.9.1)
66
67
  diff-lcs (>= 1.2.0, < 2.0)
67
68
  rspec-support (~> 3.9.0)
68
- rspec-support (3.9.2)
69
+ rspec-support (3.9.3)
69
70
  rspec_junit_formatter (0.4.1)
70
71
  rspec-core (>= 2, < 4, != 2.12.0)
71
- rubocop (0.79.0)
72
- jaro_winkler (~> 1.5.1)
72
+ rubocop (0.89.1)
73
73
  parallel (~> 1.10)
74
- parser (>= 2.7.0.1)
74
+ parser (>= 2.7.1.1)
75
75
  rainbow (>= 2.2.2, < 4.0)
76
+ regexp_parser (>= 1.7)
77
+ rexml
78
+ rubocop-ast (>= 0.3.0, < 1.0)
76
79
  ruby-progressbar (~> 1.7)
77
- unicode-display_width (>= 1.4.0, < 1.7)
78
- rubocop-performance (1.5.2)
79
- rubocop (>= 0.71.0)
80
- rubocop-rspec (1.37.1)
81
- rubocop (>= 0.68.1)
80
+ unicode-display_width (>= 1.4.0, < 2.0)
81
+ rubocop-ast (0.3.0)
82
+ parser (>= 2.7.1.4)
83
+ rubocop-performance (1.7.1)
84
+ rubocop (>= 0.82.0)
85
+ rubocop-rspec (1.43.2)
86
+ rubocop (~> 0.87)
82
87
  ruby-progressbar (1.10.1)
83
88
  safe_yaml (1.0.5)
84
89
  sawyer (0.8.2)
@@ -91,14 +96,14 @@ GEM
91
96
  simplecov-html (0.10.2)
92
97
  thread_safe (0.3.6)
93
98
  to_regexp (0.2.1)
94
- tzinfo (1.2.6)
99
+ tzinfo (1.2.7)
95
100
  thread_safe (~> 0.1)
96
- unicode-display_width (1.6.1)
97
- webmock (3.8.0)
101
+ unicode-display_width (1.7.0)
102
+ webmock (3.8.3)
98
103
  addressable (>= 2.3.6)
99
104
  crack (>= 0.3.2)
100
105
  hashdiff (>= 0.4.0, < 2.0.0)
101
- yard (0.9.24)
106
+ yard (0.9.25)
102
107
 
103
108
  PLATFORMS
104
109
  ruby
@@ -115,9 +120,9 @@ DEPENDENCIES
115
120
  rubocop
116
121
  rubocop-performance
117
122
  rubocop-rspec
118
- simplecov
123
+ simplecov (= 0.17.1)
119
124
  webmock
120
125
  yard
121
126
 
122
127
  BUNDLED WITH
123
- 2.1.2
128
+ 2.1.4
@@ -6,7 +6,9 @@ MyApiClient は API リクエストクラスを作成するための汎用的な
6
6
 
7
7
  ただし、 Sawyer はダミーデータの作成が難しかったり、他の gem で競合することがよくあるので、将来的には依存しないように変更していくかもしれません。
8
8
 
9
- また、 Ruby on Rails で利用することを想定してますが、それ以外の環境でも動作するように作っているつもりです。不具合などあれば Issue ページからご報告下さい。
9
+ また、 Ruby on Rails で利用することを想定してますが、それ以外の環境でも動作するように作っています。不具合などあれば Issue ページからご報告下さい。
10
+
11
+ [toc]
10
12
 
11
13
  ## Supported Versions
12
14
 
@@ -83,32 +85,95 @@ api_clinet.get_users #=> #<Sawyer::Response>
83
85
 
84
86
  続いて、 `#get_users` や `#post_user` を定義します。メソッド名には API のタイトルを付けると良いと思います。メソッド内部で `#get` や `#post` を呼び出していますが、これがリクエスト時の HTTP Method になります。他にも `#patch` `#put` `#delete` が利用可能です。
85
87
 
88
+ ### Pagination
89
+
90
+ API の中にはレスポンスに結果の続きを取得するための URL を含んでいるものがあります。
91
+
92
+ MyApiClient では、このような API を enumerable に扱うための `#pageable_get` というメソッドを用意しています。以下に例を示します。
93
+
94
+ ```ruby
95
+ class MyPaginationApiClient < ApplicationApiClient
96
+ endpoint 'https://example.com/v1'
97
+
98
+ # GET pagination?page=1
99
+ def pagination
100
+ pageable_get 'pagination', paging: '$.links.next', headers: headers, query: { page: 1 }
101
+ end
102
+
103
+ private
104
+
105
+ def headers
106
+ { 'Content-Type': 'application/json;charset=UTF-8' }
107
+ end
108
+ end
109
+ ```
110
+
111
+ 上記の例の場合、最初に `GET https://example.com/v1/pagination?page=1` に対してリクエストが実行され、続けてレスポンス JSON の `$.link.next` に含まれる URL に対して enumerable にリクエストを実行します。
112
+
113
+ 例えば以下のようなレスポンスであれば、`$.link.next` は `"https://example.com/pagination?page=3"` を示します。
114
+
115
+ ```json
116
+ {
117
+ "links": {
118
+ "next": "https://example.com/pagination?page=3",
119
+ "previous": "https://example.com/pagination?page=1",
120
+ },
121
+ "page": 2
122
+ }
123
+ ```
124
+
125
+ そして `#pageable_get` は [Enumerator::Lazy](https://docs.ruby-lang.org/ja/latest/class/Enumerator=3a=3aLazy.html) を返すので、 `#each` や `#next` を実行することで次の結果を取得できます。
126
+
127
+ ```ruby
128
+ api_clinet = MyPaginationApiClient.new
129
+ api_clinet.pagination.each do |response|
130
+ # Do something.
131
+ end
132
+
133
+ p = api_clinet.pagination
134
+ p.next # => 1st page result
135
+ p.next # => 2nd page result
136
+ p.next # => 3rd page result
137
+ ```
138
+
139
+ なお、`#each` はレスポンスに含まれる `paging` の値が nil になるまで繰り返されるのでご注意ください。例えば `#take` と組み合わせることでページネーションの上限を設定できます。
140
+
141
+ `#pageable_get` の alias として `#pget` も利用可能です。
142
+
143
+ ```ruby
144
+ # GET pagination?page=1
145
+ def pagination
146
+ pget 'pagination', paging: '$.links.next', headers: headers, query: { page: 1 }
147
+ end
148
+ ```
149
+
86
150
  ### Error handling
87
151
 
88
- 上記のコードにエラーハンドリングを追加してみます。
152
+ `my_api_client` ではレスポンスの内容によって例外を発生させるエラーハンドリングを定義できます。ここでは例として前述のコードにエラーハンドリングを定義しています。
89
153
 
90
154
  ```ruby
91
155
  class ExampleApiClient < MyApiClient::Base
92
156
  endpoint 'https://example.com'
93
157
 
94
- error_handling status_code: 400..499, raise: MyApiClient::ClientError
158
+ error_handling status_code: 400..499,
159
+ raise: MyApiClient::ClientError
95
160
 
96
- error_handling status_code: 500..599 do |params, logger|
161
+ error_handling status_code: 500..599, raise: MyApiClient::ServerError do |_params, logger|
97
162
  logger.warn 'Server error occurred.'
98
- raise MyApiClient::ServerError, params
99
163
  end
100
164
 
101
- error_handling json: { '$.errors.code': 10..19 }, with: :my_error_handling
165
+ error_handling json: { '$.errors.code': 10..19 },
166
+ raise: MyApiClient::ClientError,
167
+ with: :my_error_handling
102
168
 
103
169
  # Omission...
104
170
 
105
171
  private
106
172
 
107
- # @param params [MyApiClient::Params::Params] HTTP req and res params
108
- # @param logger [MyApiClient::Logger] Logger for a request processing
173
+ # @param params [MyApiClient::Params::Params] HTTP reqest and response params
174
+ # @param logger [MyApiClient::Request::Logger] Logger for a request processing
109
175
  def my_error_handling(params, logger)
110
176
  logger.warn "Response Body: #{params.response.body.inspect}"
111
- raise MyApiClient::ClientError, params
112
177
  end
113
178
  end
114
179
  ```
@@ -121,29 +186,26 @@ error_handling status_code: 400..499, raise: MyApiClient::ClientError
121
186
 
122
187
  これは `ExampleApiClient` からのリクエスト全てにおいて、レスポンスのステータスコードが `400..499` であった場合に `MyApiClient::ClientError` が例外として発生するようになります。 `ExampleApiClient` を継承したクラスにもエラーハンドリングは適用されます。ステータスコードのエラーハンドリングは親クラスで定義すると良いと思います。
123
188
 
124
- なお、 `status_code` には `Integer` `Range` `Regexp` が指定可能です。`raise` には `MyApiClient::Error` を継承したクラスが指定可能です。`my_api_client` で標準で定義しているエラークラスについては以下のソースコードをご確認下さい。
189
+ なお、 `status_code` には `Integer` `Range` `Regexp` が指定可能です。
190
+
191
+ `raise` には `MyApiClient::Error` を継承したクラスが指定可能です。`my_api_client` で標準で定義しているエラークラスについては以下のソースコードをご確認下さい。 `raise` を省略した場合は `MyApiClient::Error` を発生するようになります。
125
192
 
126
- https://github.com/ryz310/my_api_client/blob/master/lib/my_api_client/errors.rb
193
+ https://github.com/ryz310/my_api_client/blob/master/lib/my_api_client/errors
127
194
 
128
- 次に、 `raise` の代わりに `block` を指定する場合について。
195
+ 次に、 `block` を指定する場合について。
129
196
 
130
197
  ```ruby
131
- error_handling status_code: 500..599 do |params, logger|
198
+ error_handling status_code: 500..599, raise: MyApiClient::ServerError do |_params, logger|
132
199
  logger.warn 'Server error occurred.'
133
- raise MyApiClient::ServerError, params
134
200
  end
135
201
  ```
136
202
 
137
- 上記の例であれば、ステータスコードが `500..599` の場合に `block` の内容が実行れます。引数の `params` にはリクエスト情報とレスポンス情報が含まれています。`logger` はログ出力用インスタンスですが、このインスタンスを使ってログ出力すると、以下のようにリクエスト情報がログ出力に含まれるようになり、デバッグの際に便利です。
203
+ 上記の例であれば、ステータスコードが `500..599` の場合に `MyApiClient::ServerError` を発生させる前に `block` の内容が実行れます。引数の `params` にはリクエスト情報とレスポンス情報が含まれています。`logger` はログ出力用インスタンスですが、このインスタンスを使ってログ出力すると、以下のようにリクエスト情報がログ出力に含まれるようになり、デバッグの際に便利です。
138
204
 
139
205
  ```text
140
206
  API request `GET https://example.com/path/to/resouce`: "Server error occurred."
141
207
  ```
142
208
 
143
- リクエストに失敗した場合は例外処理を実行する、という設計が一般的だと思われるので、基本的にブロックの最後に `raise` を実行する事になると思います。
144
-
145
- 最後に `json` と `with` を利用する場合について。
146
-
147
209
  ```ruby
148
210
  error_handling json: { '$.errors.code': 10..19 }, with: :my_error_handling
149
211
  ```
@@ -159,17 +221,28 @@ error_handling json: { '$.errors.code': 10..19 }, with: :my_error_handling
159
221
  }
160
222
  ```
161
223
 
162
- `with` にはインスタンスメソッド名を指定することで、エラーを検出した際に任意のメソッドを実行させることができます。メソッドに渡される引数は `block` 定義の場合と同じく `params` と `logger` です。
224
+ `with` にはインスタンスメソッド名を指定することで、エラーを検出した際、例外を発生させる前に任意のメソッドを実行させることができます。メソッドに渡される引数は `block` 定義の場合と同じく `params` と `logger` です。なお、 `block` と `with` は同時には利用できません。
163
225
 
164
226
  ```ruby
165
227
  # @param params [MyApiClient::Params::Params] HTTP req and res params
166
- # @param logger [MyApiClient::Logger] Logger for a request processing
228
+ # @param logger [MyApiClient::Request::Logger] Logger for a request processing
167
229
  def my_error_handling(params, logger)
168
230
  logger.warn "Response Body: #{params.response.body.inspect}"
169
- raise MyApiClient::ClientError, params
170
231
  end
171
232
  ```
172
233
 
234
+ #### Default error handling
235
+
236
+ `my_api_client` では、標準でステータスコード 400 ~ 500 番台のレスポンスを例外として処理するようにしています。ステータスコードが 400 番台場合は `MyApiClient::ClientError`、 500 番台の場合は `MyApiClient::ServerError` を継承した例外クラスが raise されます。
237
+
238
+ また、 `MyApiClient::NetworkError` に対しても標準で `retry_on` が定義されています。
239
+
240
+ いずれも override 可能ですので、必要に応じて `error_handling` を定義して下さい。
241
+
242
+ 以下のファイルで定義しています。
243
+
244
+ https://github.com/ryz310/my_api_client/blob/master/lib/my_api_client/default_error_handlers.rb
245
+
173
246
  #### Symbol を利用する
174
247
 
175
248
  ```ruby
@@ -238,7 +311,9 @@ end
238
311
 
239
312
  API リクエストを何度も実行していると回線の不調などによりネットワークエラーが発生する事があります。長時間ネットワークが使えなくなるケースもありますが、瞬間的なエラーであるケースも多々あります。 `MyApiClient` ではネットワーク系の例外はまとめて `MyApiClient::NetworkError` として `raise` されます。この例外の詳細は後述しますが、 `retry_on` を利用する事で、 `ActiveJob` のように任意の例外処理を補足して、一定回数、一定の期間を空けて API リクエストをリトライさせる事ができます。
240
313
 
241
- ただし、 `ActiveJob` とは異なり同期処理でリトライするため、ネットワークの瞬断に備えたリトライ以外ではあまり使う機会はないのではないかと思います。上記の例のように API Limit に備えてリトライするケースもあるかと思いますが、こちらは `ActiveJob` で対応した方が良いと思います。
314
+ なお、 `retry_on MyApiClient::NetworkError` は標準実装されているため、特別に定義せずとも自動的に適用されます。 `wait` `attempts` に任意の値を設定したい場合のみ定義してご利用ください。
315
+
316
+ ただし、 `ActiveJob` とは異なり同期処理でリトライするため、ネットワークの瞬断に備えたリトライ以外ではあまり使う機会はないのではないかと思います。上記の例のように API Rate Limit に備えてリトライするケースもあるかと思いますが、こちらは `ActiveJob` で対応した方が良いかもしれません。
242
317
 
243
318
  ちなみに一応 `discard_on` も実装していますが、作者自身が有効な用途を見出せていないので、詳細は割愛します。良い利用方法があれば教えてください。
244
319
 
@@ -3,6 +3,10 @@
3
3
 
4
4
  require 'bundler/setup'
5
5
  require 'my_api_client'
6
+ require './example/api_clients/my_error_api_client'
7
+ require './example/api_clients/my_rest_api_client'
8
+ require './example/api_clients/my_pagination_api_client'
9
+ require './example/api_clients/my_status_api_client'
6
10
 
7
11
  # You can add fixtures and/or initialization code here to make experimenting
8
12
  # with your gem easier. You can also use a different console, if you like.
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'my_errors'
4
+
5
+ # An usage example of the `my_api_client`.
6
+ class ApplicationApiClient < MyApiClient::Base
7
+ endpoint ENV['MY_API_ENDPOINT']
8
+
9
+ self.logger = ::Logger.new(nil)
10
+
11
+ http_open_timeout 5.seconds
12
+ http_read_timeout 5.seconds
13
+ end
@@ -0,0 +1,34 @@
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/status_controller.rb
7
+ class MyErrorApiClient < ApplicationApiClient
8
+ error_handling json: { '$.error.message': /You requested error code/ },
9
+ raise: MyErrors::ErrorCodeOther
10
+
11
+ error_handling json: { '$.error.code': :zero? },
12
+ raise: MyErrors::ErrorCode00
13
+
14
+ error_handling json: { '$.error.code': 10 },
15
+ raise: MyErrors::ErrorCode10
16
+
17
+ error_handling json: { '$.error.code': 20..29 },
18
+ raise: MyErrors::ErrorCode2x
19
+
20
+ error_handling json: { '$.error.code': 30 },
21
+ status_code: 400,
22
+ raise: MyErrors::ErrorCode30
23
+
24
+ # GET error/:code
25
+ def get_error(code:)
26
+ get "error/#{code}", headers: headers
27
+ end
28
+
29
+ private
30
+
31
+ def headers
32
+ { 'Content-Type': 'application/json;charset=UTF-8' }
33
+ end
34
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MyErrors
4
+ # 400 Bad Request
5
+ class BadRequest < MyApiClient::ClientError; end
6
+
7
+ # 401 Unauthorized
8
+ class Unauthorized < MyApiClient::ClientError; end
9
+
10
+ # 403 Forbidden
11
+ class Forbidden < MyApiClient::ClientError; end
12
+
13
+ # Error code: 0
14
+ class ErrorCode00 < MyApiClient::ClientError; end
15
+
16
+ # Error code: 10
17
+ class ErrorCode10 < MyApiClient::ClientError; end
18
+
19
+ # Error code: 20 to 29
20
+ class ErrorCode2x < MyApiClient::ClientError; end
21
+
22
+ # Error code: 30
23
+ class ErrorCode30 < MyApiClient::ClientError; end
24
+
25
+ # Error code: other
26
+ class ErrorCodeOther < MyApiClient::ClientError; end
27
+ end
@@ -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