restify 1.15.1 → 2.0.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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +102 -15
  3. data/README.md +23 -31
  4. data/lib/restify/adapter/base.rb +4 -0
  5. data/lib/restify/adapter/telemetry.rb +54 -0
  6. data/lib/restify/adapter/typhoeus.rb +24 -14
  7. data/lib/restify/context.rb +7 -11
  8. data/lib/restify/error.rb +2 -2
  9. data/lib/restify/global.rb +1 -0
  10. data/lib/restify/link.rb +4 -4
  11. data/lib/restify/logging.rb +1 -1
  12. data/lib/restify/processors/base/parsing.rb +5 -24
  13. data/lib/restify/processors/base.rb +1 -1
  14. data/lib/restify/promise.rb +2 -2
  15. data/lib/restify/registry.rb +1 -1
  16. data/lib/restify/relation.rb +45 -17
  17. data/lib/restify/request.rb +6 -6
  18. data/lib/restify/resource.rb +1 -1
  19. data/lib/restify/response.rb +0 -2
  20. data/lib/restify/timeout.rb +2 -2
  21. data/lib/restify/version.rb +4 -4
  22. data/lib/restify.rb +0 -1
  23. data/spec/restify/cache_spec.rb +16 -12
  24. data/spec/restify/context_spec.rb +15 -7
  25. data/spec/restify/error_spec.rb +23 -16
  26. data/spec/restify/features/head_requests_spec.rb +7 -5
  27. data/spec/restify/features/request_bodies_spec.rb +14 -13
  28. data/spec/restify/features/request_errors_spec.rb +2 -2
  29. data/spec/restify/features/request_headers_spec.rb +11 -14
  30. data/spec/restify/features/response_errors_spec.rb +2 -2
  31. data/spec/restify/global_spec.rb +13 -13
  32. data/spec/restify/link_spec.rb +9 -9
  33. data/spec/restify/processors/base_spec.rb +7 -7
  34. data/spec/restify/processors/json_spec.rb +22 -62
  35. data/spec/restify/processors/msgpack_spec.rb +40 -76
  36. data/spec/restify/promise_spec.rb +38 -34
  37. data/spec/restify/registry_spec.rb +6 -8
  38. data/spec/restify/relation_spec.rb +196 -17
  39. data/spec/restify/resource_spec.rb +55 -60
  40. data/spec/restify/timeout_spec.rb +7 -7
  41. data/spec/restify_spec.rb +13 -74
  42. data/spec/spec_helper.rb +13 -17
  43. data/spec/support/stub_server.rb +3 -3
  44. metadata +35 -65
  45. data/lib/restify/adapter/em.rb +0 -139
  46. data/lib/restify/adapter/pooled_em.rb +0 -270
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 95d9cf12fd58e2f17bd1d3c046dfda23eaa38ec2fb99fe0c9b7e1034e014cd1f
4
- data.tar.gz: b995cf5d935ba1c83b403fedf18d4c35154ea0ad60d4be0437fa98c89281d687
3
+ metadata.gz: 85964ce70270ead0fcc3271b733611bcb97f8415e03a91b46cb402032a4c68f5
4
+ data.tar.gz: 0c99e59283131de272b9a2a1ad23589395bb89e5b8753e330f305e7ec1483685
5
5
  SHA512:
6
- metadata.gz: 96b5f22cc74ca967876f2ecc86bf30c70fa21ceee6f8726117862ad0e94a6319a9384673cd83a4222bd40b49f4b6eeb48cdec7bd5d1e94ac70fcdab787a8ed5b
7
- data.tar.gz: 98199df1ecf1b9467b609ae57f58f2ae459f42f7121c1947763a9d49acb7224d6b8dc50088e74cd7f563719fb81f507d88fca2252a823856e57bbf995db5cbbe
6
+ metadata.gz: 58bf934808c55172f28ec0673f543531c935b68e8e1f8fcf62435b49dfd7ab2e13522ef6c8b675fbfaf234be7ebfac4fdbfe05d57da4e97288b3876000a2487f
7
+ data.tar.gz: 4617aa58aa9ba400e1f28a0e5a854c5b56a560abb818432211958295e695feab6fe4bfeb0b5bd6418b231260db778804f4cf5309a34f8d1db9cb501d5f48fe6b
data/CHANGELOG.md CHANGED
@@ -1,12 +1,12 @@
1
1
  # Changelog
2
+
2
3
  All notable changes to this project will be documented in this file.
3
4
 
4
5
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
6
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
7
 
7
-
8
-
9
8
  ## Unreleased
9
+
10
10
  ---
11
11
 
12
12
  ### New
@@ -17,164 +17,251 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
17
17
 
18
18
  ### Breaks
19
19
 
20
+ ## 2.0.0 - (2025-02-14)
21
+
22
+ ---
23
+
24
+ ### New
25
+
26
+ - Support for Ruby 3.4
27
+ - Experimental support for OpenTelemetry tracing
28
+
29
+ ### Changes
30
+
31
+ - Strict keyword handling for request methods
32
+
33
+ All request methods take parameters and headers as explicit keyword arguments, not as secondary arguments anymore. Change e.g. `get({}, {headers: ...})` into `get(headers: ...)`, and `head(params)` to `head(params:)`.
34
+
35
+ `#post`, `#put`, and `#patch` still take an optional first positional data/body argument. Change `post(body, {}, {headers: ...})` to `post(body, headers: ...)`.
36
+
37
+ `#get`, `#head`, and `#delete` accept a hash as the first positional argument, which is merged with `params:`. Therefore, passing parameters as data works too: `get({id: 1})`.
38
+
39
+ ### Breaks
40
+
41
+ - Remove indifferent access methods (Hashie) from responses
42
+ - Removed `em` and `em-pooled` adapters
43
+ - Require Ruby 3.1+
44
+
45
+ ## 1.15.2 - (2021-12-23)
46
+
47
+ ---
48
+
49
+ ### Fixes
50
+
51
+ - ActiveSupport v7.0 issues with cache module
20
52
 
21
53
  ## 1.15.1 - (2021-07-15)
54
+
22
55
  ---
23
56
 
24
57
  ### Fixes
25
- * Typhoeus internal exception when request timed out
26
58
 
59
+ - Typhoeus internal exception when request timed out
27
60
 
28
61
  ## 1.15.0 - (2021-07-09)
62
+
29
63
  ---
30
64
 
31
65
  ### New
32
- * Improve memory usage when running lots of requests with typhoeus adapter
33
- * Use hydra for synchronous requests
34
- * Increased thread stability of typhoeus adapter (new internal queuing mechanism)
66
+
67
+ - Improve memory usage when running lots of requests with typhoeus adapter
68
+ - Use hydra for synchronous requests
69
+ - Increased thread stability of typhoeus adapter (new internal queuing mechanism)
35
70
 
36
71
  ### Changes
37
- * Use Ruby 2.5 as baseline for testing and linting
38
- * Add Ruby 3.0 to automated testing
39
- * Changed timing behavior for multiple requests due to new internal queuing mechanism for the typhoeus adapter
40
72
 
73
+ - Use Ruby 2.5 as baseline for testing and linting
74
+ - Add Ruby 3.0 to automated testing
75
+ - Changed timing behavior for multiple requests due to new internal queuing mechanism for the typhoeus adapter
41
76
 
42
77
  ## 1.14.0 - (2020-12-15)
78
+
43
79
  ---
44
80
 
45
81
  ### New
46
- * Allow making requests with non-JSON bodies and custom content types (#42)
47
82
 
83
+ - Allow making requests with non-JSON bodies and custom content types (#42)
48
84
 
49
85
  ## 1.13.0 - (2020-06-12)
86
+
50
87
  ---
51
88
 
52
89
  ### New
53
- * typhoeus: Support setting per-request libcurl options on adapter
54
- * typhoeus: Enable short TCP keepalive probes by default (5s/5s)
55
90
 
91
+ - typhoeus: Support setting per-request libcurl options on adapter
92
+ - typhoeus: Enable short TCP keepalive probes by default (5s/5s)
56
93
 
57
94
  ## 1.12.0 - (2020-04-01)
95
+
58
96
  ---
59
97
 
60
98
  ### Added
61
- * Explicit exception class for HTTP status code 410 (Gone)
99
+
100
+ - Explicit exception class for HTTP status code 410 (Gone)
62
101
 
63
102
  ### Changed
64
103
 
65
104
  ### Fixed
66
- * `GatewayError` exception classes introduced in v1.11.0 now properly inherit from `ServerError` (#30)
67
105
 
106
+ - `GatewayError` exception classes introduced in v1.11.0 now properly inherit from `ServerError` (#30)
68
107
 
69
108
  ## 1.11.0 - (2019-07-11)
109
+
70
110
  ### Added
71
- * Explicit exception classes for HTTP status codes 500, 502, 503, 504
111
+
112
+ - Explicit exception classes for HTTP status codes 500, 502, 503, 504
72
113
 
73
114
  ## 1.10.0 - 2018-12-11
115
+
74
116
  ### Changed
117
+
75
118
  - Raise more specific error on a few status codes (#17)
76
119
  - Complete promises with an empty list (but a list) of dependencies (#18)
77
120
 
78
121
  ## 1.9.0 - 2018-11-13
122
+
79
123
  ### Changed
124
+
80
125
  - Do not raise error on 3XX responses but return responses
81
126
 
82
127
  ## 1.8.0 - 2018-08-22
128
+
83
129
  ### Added
130
+
84
131
  - Add HEAD request method (#16)
85
132
 
86
133
  ## 1.7.0 - 2018-08-15
134
+
87
135
  ### Added
136
+
88
137
  - Introduce promise dependency timeouts (#15)
89
138
 
90
139
  ## 1.6.0 - 2018-08-09
140
+
91
141
  ### Changed
142
+
92
143
  - Specify headers on restify clients and individual requests (#14)
93
144
 
94
145
  ## 1.5.0 - 2018-07-31
146
+
95
147
  ### Added
148
+
96
149
  - Add MessagePack processor enabled by default
97
150
 
98
151
  ### Changed
152
+
99
153
  - Tune typhoeus adapter to be more race-condition resilent
100
154
 
101
155
  ## 1.4.4 - 2018-07-13
156
+
102
157
  ### Added
158
+
103
159
  - Add `#request` to `NetworkError` to ease debugging
104
160
 
105
161
  ### Changed
162
+
106
163
  - Fix race condition in typhoeus adapter
107
164
 
108
165
  ## 1.4.3 - 2017-11-15
166
+
109
167
  ### Added
168
+
110
169
  - Add advanced logging capabilities using logging gem
111
170
 
112
171
  ### Changed
172
+
113
173
  - Improve compatibility with webmocks returning `nil` as headers
114
174
 
115
175
  ## 1.4.1 - 2017-11-15
176
+
116
177
  ### Changed
178
+
117
179
  - Fix possible deadlock issues
118
180
 
119
181
  ## 1.4.0 - 2017-11-10
182
+
120
183
  ### Added
184
+
121
185
  - Add timeout option to requests (only supported by typhoeus adapter)
122
186
 
123
187
  ### Changed
188
+
124
189
  - Fix possible concurrency issue with typhoeus adapter
125
190
 
126
191
  ## 1.3.1 - 2017-11-10
192
+
127
193
  ### Changed
194
+
128
195
  - Improve typhoeus adapters initial request queuing
129
196
  - Disable default pipelining
130
197
 
131
198
  ## 1.3.0 - 2017-11-08
199
+
132
200
  ### Changed
201
+
133
202
  - Improve typhoeus adapter to better utilize concurrency
134
203
  - Default to new typhoeus adapter
135
204
 
136
205
  ## 1.2.1 - 2017-10-30
206
+
137
207
  ### Changed
208
+
138
209
  - Fix issue with Ruby 2.2 compatibility
139
210
 
140
211
  ## 1.2.0 - 2017-10-30
212
+
141
213
  ### Added
214
+
142
215
  - Add experimental PooledEM adapter (#10)
143
216
 
144
217
  ### Changed
218
+
145
219
  - Improve marshaling of resources
146
220
 
147
221
  ## 1.1.0 - 2017-05-12
222
+
148
223
  ### Added
224
+
149
225
  - Add shortcuts for creating fulfilled / rejected promises (#6)
150
226
 
151
227
  ### Changed
228
+
152
229
  - Return response body if no processor matches (#7)
153
230
 
154
231
  ## 1.0.0 - 2016-08-22
232
+
155
233
  ### Added
234
+
156
235
  - Experimental cache API doing nothing for now
157
236
 
158
237
  ### Changed
238
+
159
239
  - Use `~> 1.0` of `concurrent-ruby`
160
240
 
161
241
  ## 0.5.0 - 2016-04-04
242
+
162
243
  ### Added
244
+
163
245
  - Add `sync` option to typhoeus adapter
164
246
  - Add registry for storing entry points
165
247
 
166
248
  ### Changed
249
+
167
250
  - Make eventmachine based adapter default
168
251
 
169
252
  ## 0.4.0 - 2016-02-24
253
+
170
254
  ### Added
255
+
171
256
  - Add method to explicit access resource data
172
257
 
173
258
  ### Changed
259
+
174
260
  - Use typhoeus as default adapter
175
261
  - `Restify.new` returns relation now instead of resource
176
262
 
177
263
  ### Removed
264
+
178
265
  - Drop obligation in favor of simple Concurrent::IVar based promise class.
179
266
  Notable changes:
180
267
  - Returned object us of type `Restify::Promise` now.
data/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  # Restify
2
2
 
3
- [![Build Status](https://travis-ci.org/jgraichen/restify.svg?branch=master)](https://travis-ci.org/jgraichen/restify)
4
- [![Code Quality](https://codebeat.co/badges/18ffe6b7-8239-493a-b5b6-be329b9f275d)](https://codebeat.co/projects/github-com-jgraichen-restify-master)
3
+ [![Gem Version](https://img.shields.io/gem/v/restify?logo=ruby)](https://rubygems.org/gems/restify)
4
+ [![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/jgraichen/restify/test.yml?logo=github)](https://github.com/jgraichen/restify/actions)
5
+ [![Code Quality](https://codebeat.co/badges/368f8033-bd76-48bc-9777-85f1d4befa94)](https://codebeat.co/projects/github-com-jgraichen-restify-main)
5
6
 
6
7
  Restify is an hypermedia REST client that does parallel, concurrent and keep-alive requests by default.
7
8
 
@@ -27,16 +28,19 @@ Links are extracted from
27
28
  * HTTP Link header
28
29
  * Github-style relations in payloads
29
30
 
30
- ### Planned features
31
+ ## Installation
31
32
 
32
- * HTTP cache
33
- * API versions via header
34
- * Content-Type and Language negotiation
35
- * Processors for JSON-HAL, etc.
33
+ Add it to your Gemfile:
36
34
 
37
- ## Installation
35
+ ```ruby
36
+ gem 'restify', '~> 2.0'
37
+ ```
38
38
 
39
- Add it to your Gemfile or install it manually: `$ gem install restify`
39
+ Or install it manually:
40
+
41
+ ```console
42
+ gem install restify
43
+ ```
40
44
 
41
45
  ## Usage
42
46
 
@@ -51,7 +55,7 @@ client = Restify.new('https://api.github.com').get.value
51
55
  # ...
52
56
  ```
53
57
 
54
- We are essentially requesting `'http://api.github.com'` via HTTP `get`. `get` is returning an `Promise`, similar to Java's `Future`. The `value` call resolves the returned `Promise` by blocking the thread until the resource is actually there. `value!` will additionally raise errors instead of returning `nil`. You can chain handlers using the `then` method. This allows you to be build a dependency chain that will be executed when the last promise is needed.
58
+ We are essentially requesting `'http://api.github.com'` via HTTP `get`. `get` is returning a `Promise`, similar to Java's `Future`. The `value` call resolves the returned `Promise` by blocking the thread until the resource is actually there. `value!` will additionally raise errors instead of returning `nil`. You can chain handlers using the `then` method. This allows you to be build a dependency chain that will be executed when the last promise is needed.
55
59
 
56
60
  As we can see GitHub returns us a field `repository_url` with a URI template. Restify automatically scans for `*_url` fields in the JSON response and exposes these as relations. It additionally scans the HTTP Header field `Link` for relations like pagination.
57
61
 
@@ -65,33 +69,21 @@ repositories = client.rel(:repository)
65
69
  This gets us the relation named `repository` that we can request now. The usual HTTP methods are available on a relation:
66
70
 
67
71
  ```ruby
68
- def get(params = {})
69
- request :get, nil, params
70
- end
71
-
72
- def delete(params = {})
73
- request :delete, nil, params
74
- end
75
-
76
- def post(data = {}, params = {})
77
- request :post, data, params
78
- end
79
-
80
- def put(data = {}, params = {})
81
- request :put, data, params
82
- end
72
+ def get(params, params:, headers:, **)
73
+ def head(params, params:, headers:, **)
74
+ def delete(params, params:, headers:, **)
83
75
 
84
- def patch(data = {}, params = {})
85
- request :patch, data, params
86
- end
76
+ def put(data = nil, params:, headers:, **)
77
+ def post(data = nil, params:, headers:, **)
78
+ def patch(data = nil, params:, headers:, **)
87
79
  ```
88
80
 
89
- URL templates can define some parameters such as `{owner}` or `{repo}`. They will be expanded from the `params` given to the HTTP method method.
81
+ URL templates can define some parameters such as `{owner}` or `{repo}`. They will be expanded from the `params` given to the HTTP method.
90
82
 
91
83
  Now send a GET request with some parameters to request a specific repository:
92
84
 
93
85
  ```ruby
94
- repo = repositories.get(owner: 'jgraichen', repo: 'restify').value
86
+ repo = repositories.get({owner: 'jgraichen', repo: 'restify'}).value
95
87
  ```
96
88
 
97
89
  Now fetch a list of commits for this repo and get this first one:
@@ -121,7 +113,7 @@ See commented example in main spec [`spec/restify_spec.rb`](https://github.com/j
121
113
 
122
114
  ## License
123
115
 
124
- Copyright (C) 2014-2018 Jan Graichen
116
+ Copyright (C) 2014-2025 Jan Graichen
125
117
 
126
118
  This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
127
119
 
@@ -1,8 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'restify/adapter/telemetry'
4
+
3
5
  module Restify
4
6
  module Adapter
5
7
  class Base
8
+ prepend Telemetry
9
+
6
10
  def call(request)
7
11
  Promise.create do |writer|
8
12
  call_native request, writer
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'opentelemetry'
4
+ require 'opentelemetry/common'
5
+
6
+ module Restify
7
+ module Adapter
8
+ module Telemetry
9
+ def call(request)
10
+ method = request.method.to_s.upcase
11
+ uri = URI.parse(request.uri)
12
+ name = "#{method} #{uri.scheme}://#{uri.host}:#{uri.port}"
13
+
14
+ attributes = {
15
+ 'http.request.method' => method,
16
+ 'server.address' => uri.host,
17
+ 'server.port' => uri.port,
18
+ 'url.full' => uri.to_s,
19
+ 'url.scheme' => uri.scheme,
20
+ }
21
+
22
+ span = tracer.start_span(name, attributes:, kind: :client)
23
+ OpenTelemetry::Trace.with_span(span) do
24
+ OpenTelemetry.propagation.inject(request.headers)
25
+
26
+ super.tap do |x|
27
+ x.add_observer do |_, response, err|
28
+ if response
29
+ span.set_attribute('http.response.status_code', response&.code)
30
+ span.status = OpenTelemetry::Trace::Status.error unless (100..399).cover?(response&.code)
31
+ end
32
+
33
+ span.status = OpenTelemetry::Trace::Status.error(err) if err
34
+
35
+ span.finish
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ protected
42
+
43
+ def tracer
44
+ Telemetry.tracer
45
+ end
46
+
47
+ class << self
48
+ def tracer
49
+ @tracer ||= OpenTelemetry.tracer_provider.tracer('restify', Restify::VERSION.to_s)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'typhoeus'
4
4
 
5
- ::Ethon.logger = ::Logging.logger[Ethon]
5
+ Ethon.logger = Logging.logger[Ethon]
6
6
 
7
7
  module Restify
8
8
  module Adapter
@@ -13,18 +13,36 @@ module Restify
13
13
 
14
14
  DEFAULT_HEADERS = {
15
15
  'Expect' => '',
16
- 'Transfer-Encoding' => ''
16
+ 'Transfer-Encoding' => '',
17
17
  }.freeze
18
18
 
19
19
  DEFAULT_OPTIONS = {
20
20
  followlocation: true,
21
21
  tcp_keepalive: true,
22
22
  tcp_keepidle: 5,
23
- tcp_keepintvl: 5
23
+ tcp_keepintvl: 5,
24
24
  }.freeze
25
25
 
26
+ # Patch to store easy handles in the queue, instead of requests.
27
+ # This improves compatibility with OpenTelemetry instrumentation
28
+ # for Ethon, that needs the request handle to be constructed in
29
+ # the current threading context, not the background thread were
30
+ # Typhoeus is running.
31
+ module EasyOverride
32
+ def queue(request)
33
+ request.hydra = self
34
+ queued_requests << ::Typhoeus::EasyFactory.new(request, self).get
35
+ end
36
+
37
+ def add(handle)
38
+ multi.add(handle)
39
+ end
40
+ end
41
+
26
42
  def initialize(sync: false, options: {}, **kwargs)
27
- @hydra = ::Typhoeus::Hydra.new(**kwargs)
43
+ @hydra = ::Typhoeus::Hydra.new(**kwargs)
44
+ @hydra.extend(EasyOverride)
45
+
28
46
  @mutex = Mutex.new
29
47
  @options = DEFAULT_OPTIONS.merge(options)
30
48
  @queue = Queue.new
@@ -38,7 +56,6 @@ module Restify
38
56
  @sync
39
57
  end
40
58
 
41
- # rubocop:disable Metrics/MethodLength
42
59
  def call_native(request, writer)
43
60
  req = convert(request, writer)
44
61
 
@@ -57,12 +74,9 @@ module Restify
57
74
  thread.run unless thread.status
58
75
  end
59
76
  end
60
- # rubocop:enable Metrics/MethodLength
61
77
 
62
78
  private
63
79
 
64
- # rubocop:disable Metrics/AbcSize
65
- # rubocop:disable Metrics/MethodLength
66
80
  def convert(request, writer)
67
81
  ::Typhoeus::Request.new(
68
82
  request.uri,
@@ -71,7 +85,7 @@ module Restify
71
85
  headers: DEFAULT_HEADERS.merge(request.headers),
72
86
  body: request.body,
73
87
  timeout: request.timeout,
74
- connecttimeout: request.timeout
88
+ connecttimeout: request.timeout,
75
89
  ).tap do |req|
76
90
  req.on_complete do |response|
77
91
  debug 'request:complete',
@@ -93,8 +107,6 @@ module Restify
93
107
  end
94
108
  end
95
109
  end
96
- # rubocop:enable Metrics/MethodLength
97
- # rubocop:enable Metrics/AbcSize
98
110
 
99
111
  def convert_back(response, request)
100
112
  uri = request.uri
@@ -108,7 +120,7 @@ module Restify
108
120
  def convert_headers(headers)
109
121
  return {} unless headers.respond_to?(:each_pair)
110
122
 
111
- headers.each_pair.each_with_object({}) do |header, memo|
123
+ headers.each_pair.with_object({}) do |header, memo|
112
124
  memo[header[0].upcase.tr('-', '_')] = header[1]
113
125
  end
114
126
  end
@@ -127,7 +139,6 @@ module Restify
127
139
  @thread
128
140
  end
129
141
 
130
- # rubocop:disable Metrics/MethodLength
131
142
  def run
132
143
  runs = 0
133
144
 
@@ -154,7 +165,6 @@ module Restify
154
165
  ensure
155
166
  debug 'hydra:exit'
156
167
  end
157
- # rubocop:enable Metrics/MethodLength
158
168
 
159
169
  def dequeue_all
160
170
  loop do
@@ -47,26 +47,22 @@ module Restify
47
47
  processor.new(context, response).resource
48
48
  end
49
49
 
50
- # rubocop:disable Metrics/MethodLength
51
50
  def request(method, uri, data: nil, headers: {}, **kwargs)
52
51
  request = Request.new(
53
52
  headers: default_headers.merge(headers),
54
53
  **kwargs,
55
- method: method,
54
+ method:,
56
55
  uri: join(uri),
57
- data: data
56
+ data:,
58
57
  )
59
58
 
60
59
  ret = cache.call(request) {|req| adapter.call(req) }
61
60
  ret.then do |response|
62
- if response.errored?
63
- raise ResponseError.from_code(response)
64
- else
65
- process response
66
- end
61
+ raise ResponseError.from_code(response) if response.errored?
62
+
63
+ process(response)
67
64
  end
68
65
  end
69
- # rubocop:enable all
70
66
 
71
67
  def encode_with(coder)
72
68
  coder.map = marshal_dump
@@ -79,12 +75,12 @@ module Restify
79
75
  def marshal_dump
80
76
  {
81
77
  uri: uri.to_s,
82
- headers: default_headers
78
+ headers: default_headers,
83
79
  }
84
80
  end
85
81
 
86
82
  def marshal_load(dump)
87
- initialize dump.delete(:uri), \
83
+ initialize dump.delete(:uri),
88
84
  headers: dump.fetch(:headers)
89
85
  end
90
86
 
data/lib/restify/error.rb CHANGED
@@ -55,8 +55,8 @@ module Restify
55
55
 
56
56
  def initialize(response)
57
57
  @response = response
58
- super "#{response.message} (#{response.code}) for `#{response.uri}':\n" \
59
- " #{errors.inspect}"
58
+ super("#{response.message} (#{response.code}) for `#{response.uri}':\n " \
59
+ "#{errors.inspect}")
60
60
  end
61
61
 
62
62
  # Return response status.
@@ -20,6 +20,7 @@ module Restify
20
20
 
21
21
  def cache
22
22
  @cache ||= begin
23
+ require 'active_support'
23
24
  require 'active_support/cache'
24
25
  Restify::Cache.new store: ActiveSupport::Cache::MemoryStore.new
25
26
  end
data/lib/restify/link.rb CHANGED
@@ -25,10 +25,10 @@ module Restify
25
25
  end
26
26
 
27
27
  class << self
28
- REGEXP_URI = /<[^>]*>\s*/.freeze
29
- REGEXP_PAR = /;\s*\w+\s*=\s*/i.freeze
30
- REGEXP_QUT = /"[^"]*"\s*/.freeze
31
- REGEXP_ARG = /\w+\s*/i.freeze
28
+ REGEXP_URI = /<[^>]*>\s*/
29
+ REGEXP_PAR = /;\s*\w+\s*=\s*/i
30
+ REGEXP_QUT = /"[^"]*"\s*/
31
+ REGEXP_ARG = /\w+\s*/i
32
32
 
33
33
  def parse(string)
34
34
  scanner = StringScanner.new(string.strip)
@@ -14,7 +14,7 @@ module Restify
14
14
  _log_prefix,
15
15
  *Array(tag),
16
16
  message,
17
- _fmt(**kwargs)
17
+ _fmt(**kwargs),
18
18
  ].map(&:to_s).reject(&:empty?).join(' ')
19
19
  end
20
20
  end