api-response-presenter 0.0.1 → 0.0.2

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
  SHA256:
3
- metadata.gz: 34e509264188009fe9c15dd6c38c58286b338a688e33372f1e15ab690e4f7416
4
- data.tar.gz: a3365ff34ea26895b3393dccc4c450ccb6645dd7d7410931c2ba4c47e1c16690
3
+ metadata.gz: dc3133cf4ef59c353137dc02d8d34e431cb1f7f57360549206bc477e8cef8164
4
+ data.tar.gz: 5aa97d07e425e3f178934418c5ff025a3f2cf90c3f4217144f167f55daa6a87a
5
5
  SHA512:
6
- metadata.gz: f205f9e01e0853e9afed337b6460b3672984bb632eb2e6d7ed6ea9a41d31d9bf3e3ca2cd265f9929a856b304b4f8b2b909a470ab7e5d9ee319d6ac0725e02b68
7
- data.tar.gz: 3fb35b7a9b8def679a29868f4b9cab6fd7cd9a48a653e3d5a5329b8fcbf9a72ec9bf132cee5bcc67ee3c64e54debc3c045abdcd6ce3d4c6e991e2c2c08cacc6f
6
+ metadata.gz: e72be12e09674208d9e763ce8ceb3067dc2d7ed305afdbc984e9f4870f56f22a36c70075efc4cefaf33774bcf13cb70631c807bd76ed418ebb52e74a68bc0039
7
+ data.tar.gz: 9a13ab7903e5c322f3760ee2b324ed695bad33c50b825a06ad4ec58bf4bbe16500c44066f6b2bba51726d3c0fb48171ba3d755f4802327fceb7bcdab54548fe9
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![Coverage Status](https://coveralls.io/repos/github/golifox/api-response-presenter/badge.svg)](https://coveralls.io/github/golifox/api-response-presenter)
4
4
  [![Inline docs](https://inch-ci.org/github/golifox/api-response-presenter.svg?branch=main)](https://inch-ci.org/github/golifox/api-response-presenter)
5
5
 
6
- The `api-response-presenter` gem provides a flexible and easy-to-use interface for processing API responses using Faraday or
6
+ The `api-response-presenter` gem provides a flexible and easy-to-use interface for presenting API responses using Faraday or
7
7
  RestClient with the possibility to configure global settings or per-instance settings. It leverages
8
8
  the `Dry::Configurable` for configurations, ensuring high performance and full test coverage.
9
9
 
@@ -35,7 +35,7 @@ gem install api-response-presenter
35
35
 
36
36
  ### Configuration
37
37
 
38
- You can configure api_response globally in an initializer or setup block:
38
+ You can configure `api-response-presenter` globally in an initializer or setup block:
39
39
 
40
40
  ```ruby
41
41
  # config/initializers/api_response.rb
@@ -88,6 +88,30 @@ end
88
88
 
89
89
  ```
90
90
 
91
+ Also you can create decorator for using functionality e.g.
92
+
93
+ ```ruby
94
+ module ApiResponseHandler # or ExternalApiBaseClass
95
+ private def with_presentation(response, **, &)
96
+ ApiResponse::Presenter.call(response, **, &)
97
+ end
98
+ end
99
+
100
+ class ExtenalApiService < ExternalApiBaseClass
101
+ # or include ApiResponseHandler
102
+
103
+ ...
104
+
105
+ def get_external_data(*, **, &)
106
+ response = get('/data', *)
107
+
108
+ with_presentation(response, **, &)
109
+ end
110
+
111
+ ...
112
+ end
113
+ ```
114
+
91
115
  ### Config options
92
116
 
93
117
  - `ApiResponse.config.adapter`: response adapter that you are using.
@@ -174,8 +198,12 @@ class EmployeeApiService
174
198
  def self.get_employees(monad: false, adapter: :faraday, **options)
175
199
  # or (params, presenter_options = {})
176
200
  response = Faraday.get('https://api.example.com/data', params) # => body: "{\"data\": [{\"id\": 1, \"name\": \"John\"}]}"
177
- ApiResponse::Presenter.call(response, monad: monad, adapter: adapter) do |c|
178
- c.extract_from_body = ->(body) { Kaminari.paginate_array(body[:data]).page(1).per(5) }
201
+
202
+ page = options.fetch(:page, 1)
203
+ per = options.fetch(:per, 5)
204
+
205
+ ApiResponse::Presenter.call(response, monad: monad, adapter: adapter) do |c|
206
+ c.extract_from_body = ->(body) { Kaminari.paginate_array(body[:data]).page(page).per(per) }
179
207
  c.struct = Employee
180
208
  c.default_return_value = []
181
209
  end
@@ -249,6 +277,31 @@ or
249
277
  ApiResponse::Presenter.call(response, success_processor: MyClass, failure_processor: MyClass, parser: MyClass)
250
278
  ```
251
279
 
280
+ NOTE: If you are using Faraday with Oj middleware to parse json body already, you should redefine parser like this (in next gem version will be available configuring parsing (on/off))
281
+
282
+ ```ruby
283
+ # config/initializers/api_response.rb
284
+
285
+ require 'api_response'
286
+
287
+ class EmptyParser
288
+ attr_reader :response, :config
289
+
290
+ def initialize(response, config: nil)
291
+ @response = response
292
+ @config = config
293
+ end
294
+
295
+ def call
296
+ response.body
297
+ end
298
+ end
299
+
300
+ ApiResponse.configure do |config|
301
+ config.parser = EmptyParser
302
+ end
303
+ ```
304
+
252
305
  #### Options
253
306
 
254
307
  Also you can add custom options to `ApiResponse.config.options = {}` and use it in your processor or parser:
@@ -25,9 +25,10 @@ Gem::Specification.new do |s|
25
25
  s.add_runtime_dependency 'dry-initializer', '~> 3.0'
26
26
  s.add_runtime_dependency 'dry-monads', '~> 1.6'
27
27
  s.add_runtime_dependency 'dry-types', '~> 1.5'
28
- s.add_runtime_dependency 'oj', '~> 3.13'
28
+ s.add_runtime_dependency 'oj', '~> 3.16.3'
29
29
  s.add_runtime_dependency 'zeitwerk', '~> 2.4'
30
30
 
31
+ s.add_runtime_dependency 'dry-struct', '~> 1.5'
31
32
  s.add_development_dependency 'rake'
32
33
  s.add_development_dependency 'rspec'
33
34
  end
@@ -32,7 +32,7 @@ module ApiResponse
32
32
 
33
33
  def build_error_monad
34
34
  status = config.default_status || prepare_status(response)
35
- error = config.default_error || response_body.fetch(:error, nil) || response_body
35
+ error = config.error_json ? response_body : build_error
36
36
  error_key = config.default_error_key || response_body.fetch(:error_key, nil)
37
37
 
38
38
  Failure({error: error, error_key: error_key, status: status})
@@ -58,6 +58,10 @@ module ApiResponse
58
58
  config.default_status
59
59
  end
60
60
  end
61
+
62
+ def build_error
63
+ config.default_error || response_body
64
+ end
61
65
  end
62
66
  end
63
67
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ApiResponse
4
- VERSION = '0.0.1'
4
+ VERSION = '0.0.2'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api-response-presenter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Rybolovlev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-10 00:00:00.000000000 Z
11
+ date: 2024-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-configurable
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '3.13'
75
+ version: 3.16.3
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '3.13'
82
+ version: 3.16.3
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: zeitwerk
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '2.4'
97
+ - !ruby/object:Gem::Dependency
98
+ name: dry-struct
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.5'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.5'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: rake
99
113
  requirement: !ruby/object:Gem::Requirement