rest-client-wrapper 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,249 @@
1
+ # Copyright (C) 2019 The University of Adelaide
2
+ #
3
+ # This file is part of Rest-Client-Wrapper.
4
+ #
5
+ # Rest-Client-Wrapper is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Rest-Client-Wrapper is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with Rest-Client-Wrapper. If not, see <http://www.gnu.org/licenses/>.
17
+ #
18
+
19
+ require "spec_helper"
20
+
21
+ # RestClientWrapper
22
+ module RestClientWrapper # rubocop:disable Metrics/ModuleLength
23
+
24
+ describe RestClient do
25
+
26
+ before(:context) do
27
+ @api_url = URI.parse("http://fake_api_site.com")
28
+ @rest_client = RestClient.new({ host: @api_url.to_s })
29
+
30
+ @client_id = "client_id"
31
+ @client_secret = "client_secret"
32
+ @api_token_uri = URI.parse("http://fake_oauth_token.com/token_url_path")
33
+
34
+ @oauth_client = RestClient.new({ host: @api_url.to_s })
35
+ @oauth_client.authenticator = Authenticator::Oauth.new(
36
+ {
37
+ site: "#{ @api_token_uri.scheme }://#{ @api_token_uri.host }",
38
+ token_url_path: @api_token_uri.path,
39
+ client_id: @client_id,
40
+ client_secret: @client_secret
41
+ }
42
+ )
43
+ end
44
+
45
+ describe "#execute" do
46
+
47
+ before(:example) do
48
+ @course_id = "fake_course_id"
49
+ @uri = "/api/v1/courses/#{ @course_id }"
50
+ @rest_client.authenticator = Authenticator::Basic.new({ username: "username", password: "password" })
51
+ request = FactoryBot.build(:request, { body: {}, headers: FactoryBot.build(:request_headers, { host: @api_url.host }).to_h }).to_h
52
+ response = FactoryBot.build(:response).to_h
53
+ @api_request = stub_request(:get, "#{ @api_url }#{ @uri }").with(request).to_return(response)
54
+ end
55
+
56
+ context "when the request is valid" do
57
+
58
+ it "will return a valid response" do
59
+ request = Request.new({ http_method: :get, uri: "/api/v1/courses/%<course_id>s" })
60
+ request.segment_params = { course_id: @course_id }
61
+ @rest_client.execute({ request: request })
62
+ expect(@api_request).to have_been_requested
63
+ expect(@api_request).to have_been_requested.times(1)
64
+ end
65
+
66
+ end
67
+
68
+ context "when put request with query params and payload" do
69
+
70
+ before(:example) do
71
+ @request = Request.new({ http_method: :put, uri: "/api/v1/courses/%<course_id>s" })
72
+ @request.segment_params = { course_id: @course_id }
73
+ @request.payload = { id: "value" }
74
+ @request.query_params = { param: "value" }
75
+
76
+ @mock_request = FactoryBot.build(:request, { body: @request.payload, headers: FactoryBot.build(:request_headers, { host: @api_url.host }).to_h }).to_h
77
+ @response = FactoryBot.build(:response).to_h
78
+ end
79
+
80
+ it "has query string params in URL and payload as json in body" do
81
+ @api_request = stub_request(:put, "#{ @api_url }#{ @uri }?#{ @request.query_params.to_query }").with(@mock_request).to_return(@response)
82
+ @rest_client.execute({ request: @request })
83
+ expect(@api_request).to have_been_requested
84
+ end
85
+
86
+ end
87
+
88
+ context "when access token is no longer valid/expired" do
89
+
90
+ before(:example) do
91
+ @uri = "/api/v1/courses/course_id"
92
+ @requests = []
93
+ request = FactoryBot.build(:request, { body: {}, headers: FactoryBot.build(:request_headers, { host: @api_url.host }).to_h }).to_h
94
+ # Respond with unauthorized error to force reauth
95
+ response = FactoryBot.build(:response, { status: Rack::Utils::SYMBOL_TO_STATUS_CODE[:unauthorized] }).to_h
96
+
97
+ @requests << stub_request(:get, "#{ @api_url }#{ @uri }").with(request).to_return(response)
98
+
99
+ oauth_request = FactoryBot.build(:oauth_token_request, { headers: FactoryBot.build(:request_headers, { host: @api_token_uri.host }).to_h }).to_h
100
+ oauth_response = FactoryBot.build(:auth_token_response).to_h
101
+
102
+ @requests << stub_request(:post, @api_token_uri.to_s).with(oauth_request).to_return(oauth_response)
103
+
104
+ response = FactoryBot.build(:response, { status: Rack::Utils::SYMBOL_TO_STATUS_CODE[:ok] }).to_h
105
+ @requests << stub_request(:get, "#{ @api_url }#{ @uri }").with(request).to_return(response)
106
+ end
107
+
108
+ it "will get a new access_token" do
109
+ request = Request.new({ http_method: :get, uri: @uri })
110
+ request.segment_params = { course_id: @course_id }
111
+ @oauth_client.execute({ request: request })
112
+ @requests.each do |req|
113
+ expect(req).to have_been_requested.times(1)
114
+ end
115
+ end
116
+
117
+ end
118
+
119
+ context "when there's a response with a status code not in the retry list" do
120
+
121
+ before(:example) do
122
+ WebMock.reset_executed_requests!
123
+ request = FactoryBot.build(:request, { body: {}, headers: FactoryBot.build(:request_headers, { host: @api_url.host }).to_h }).to_h
124
+ response = FactoryBot.build(:response, { status: Rack::Utils::SYMBOL_TO_STATUS_CODE[:internal_server_error] }).to_h
125
+ @api_request = stub_request(:get, "#{ @api_url }#{ @uri }").with(request).to_return(response)
126
+ end
127
+
128
+ it "will raise an exception" do
129
+ request = Request.new({ http_method: :get, uri: "/api/v1/courses/%<course_id>s" })
130
+ request.segment_params = { course_id: @course_id }
131
+ expect { @rest_client.execute({ request: request }) }.to raise_exception(RestClientError)
132
+ expect(@api_request).to have_been_requested.times(1)
133
+ end
134
+
135
+ end
136
+
137
+ context "when there's a response status code is 429 (too many requests)" do
138
+
139
+ before(:example) do
140
+ WebMock.reset_executed_requests!
141
+ request = FactoryBot.build(:request, { body: {}, headers: FactoryBot.build(:request_headers, { host: @api_url.host }).to_h }).to_h
142
+ response = FactoryBot.build(:response, { status: Rack::Utils::SYMBOL_TO_STATUS_CODE[:too_many_requests] }).to_h
143
+ @api_request = stub_request(:get, "#{ @api_url }#{ @uri }").with(request).to_return(response)
144
+ end
145
+
146
+ it "will retry three times than raise an exception" do
147
+ request = Request.new({ http_method: :get, uri: "/api/v1/courses/%<course_id>s" })
148
+ request.segment_params = { course_id: @course_id }
149
+ expect { @rest_client.execute({ request: request }) }.to raise_exception(RestClientError)
150
+ expect(@api_request).to have_been_requested.times(4) # initial request + 3 retries
151
+ end
152
+
153
+ end
154
+
155
+ end
156
+
157
+ describe "#make_request" do
158
+
159
+ before(:example) do
160
+ WebMock.reset_executed_requests!
161
+ @course_id = "fake_course_id"
162
+ @uri = "/api/v1/courses/#{ @course_id }"
163
+ @rest_client.authenticator = Authenticator::Basic.new({ username: "username", password: "password" })
164
+ request = FactoryBot.build(:request, { body: {}, headers: FactoryBot.build(:request_headers, { host: @api_url.host }).to_h }).to_h
165
+ response = FactoryBot.build(:response).to_h
166
+ @api_request = stub_request(:get, "#{ @api_url }#{ @uri }").with(request).to_return(response)
167
+ end
168
+
169
+ context "when the request is valid" do
170
+
171
+ it "will return a valid response" do
172
+ @rest_client.make_request({ http_method: :get, uri: @uri })
173
+ expect(@api_request).to have_been_requested
174
+ expect(@api_request).to have_been_requested.times(1)
175
+ end
176
+
177
+ end
178
+
179
+ end
180
+
181
+ describe "#get_all_pages" do
182
+
183
+ before(:example) do
184
+ WebMock.reset_executed_requests!
185
+ @uri = "/api/v1/courses/enrollments"
186
+ @per_page = 500
187
+ @requests = []
188
+
189
+ @rest_client.authenticator = Authenticator::Basic.new({ username: "username", password: "password" })
190
+
191
+ # Stubing requests and responses for pagination calls
192
+ 1.upto(4) do |page_number|
193
+ response = FactoryBot.build(:paginated_response).to_h
194
+ # Add "next" link header for all responses except the last one. (i.e. so that we're only processing 4 pages)
195
+ response[:headers][:link] = "<#{ @api_url }#{ @uri }?page=#{ page_number + 1 }&per_page=#{ @per_page }>; rel=\"next\"" if page_number < 4
196
+ request = FactoryBot.build(:request, { body: { per_page: @per_page, page: page_number }, headers: FactoryBot.build(:request_headers, { host: @api_url.host }).to_h }).to_h
197
+ api_request = stub_request(:get, "#{ @api_url }#{ @uri }").with(request).to_return(response)
198
+ @requests << api_request
199
+ end
200
+
201
+ end
202
+
203
+ context "when a pagination request is made" do
204
+
205
+ it "will recursively make pagination requests until there's no page left" do
206
+ skip "TODO: move to Paginator"
207
+ @rest_client.get_all_pages({ http_method: :get, uri: @uri, payload: { per_page: @per_page } })
208
+ @requests.each do |request|
209
+ expect(request).to have_been_requested.times(1)
210
+ end
211
+
212
+ end
213
+
214
+ end
215
+
216
+ end
217
+
218
+ describe "#_validate_request" do
219
+
220
+ before(:example) do
221
+ @request = Request.new({ http_method: :get, uri: "/public/api/v1/users/%<user_id>s" })
222
+ end
223
+
224
+ context "when URI is missing a segments parameter" do
225
+
226
+ it "will raise ArgumentError" do
227
+ expect { @rest_client.send(:_validate_request, @request) }.to raise_error(ArgumentError)
228
+ end
229
+
230
+ end
231
+
232
+ context "when all segment parameters are present for URI" do
233
+
234
+ before(:example) do
235
+ @request = Request.new({ http_method: :get, uri: "/public/api/v1/courses/%<course_id>s/user/%<user_id>s" })
236
+ @request.segment_params = { user_id: "user_id", course_id: "course_id" }
237
+ end
238
+
239
+ it "return not raise an error" do
240
+ expect { @rest_client.send(:_validate_request, @request) }.not_to raise_error
241
+ end
242
+
243
+ end
244
+
245
+ end
246
+
247
+ end
248
+
249
+ end
@@ -0,0 +1,75 @@
1
+ # Copyright (C) 2019 The University of Adelaide
2
+ #
3
+ # This file is part of Rest-Client-Wrapper.
4
+ #
5
+ # Rest-Client-Wrapper is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Rest-Client-Wrapper is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with Rest-Client-Wrapper. If not, see <http://www.gnu.org/licenses/>.
17
+ #
18
+
19
+ require "pry"
20
+ require "rest_client_wrapper/authenticators/basic"
21
+ require "rest_client_wrapper/authenticators/custom"
22
+ require "rest_client_wrapper/authenticators/oauth"
23
+ require "rest_client_wrapper/rest_client"
24
+ require "rest_client_wrapper/request"
25
+ require "rest_client_wrapper/response"
26
+ require "support/factory_bot"
27
+ require "webmock/rspec"
28
+ require "faker"
29
+
30
+ # This file was generated by the `rspec --init` command. Conventionally, all
31
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
32
+ # The generated `.rspec` file contains `--require spec_helper` which will cause
33
+ # this file to always be loaded, without a need to explicitly require it in any
34
+ # files.
35
+ #
36
+ # Given that it is always loaded, you are encouraged to keep this file as
37
+ # light-weight as possible. Requiring heavyweight dependencies from this file
38
+ # will add to the boot time of your test suite on EVERY test run, even for an
39
+ # individual file that may not need all of that loaded. Instead, consider making
40
+ # a separate helper file that requires the additional dependencies and performs
41
+ # the additional setup, and require it from the spec files that actually need
42
+ # it.
43
+ #
44
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
45
+ RSpec.configure do |config|
46
+ # rspec-expectations config goes here. You can use an alternate
47
+ # assertion/expectation library such as wrong or the stdlib/minitest
48
+ # assertions if you prefer.
49
+ config.expect_with :rspec do |expectations|
50
+ # This option will default to `true` in RSpec 4. It makes the `description`
51
+ # and `failure_message` of custom matchers include text for helper methods
52
+ # defined using `chain`, e.g.:
53
+ # be_bigger_than(2).and_smaller_than(4).description
54
+ # # => "be bigger than 2 and smaller than 4"
55
+ # ...rather than:
56
+ # # => "be bigger than 2"
57
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
58
+ end
59
+
60
+ # rspec-mocks config goes here. You can use an alternate test double
61
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
62
+ config.mock_with :rspec do |mocks|
63
+ # Prevents you from mocking or stubbing a method that does not exist on
64
+ # a real object. This is generally recommended, and will default to
65
+ # `true` in RSpec 4.
66
+ mocks.verify_partial_doubles = true
67
+ end
68
+
69
+ # This option will default to `:apply_to_host_groups` in RSpec 4 (and will
70
+ # have no way to turn it off -- the option exists only for backwards
71
+ # compatibility in RSpec 3). It causes shared context metadata to be
72
+ # inherited by the metadata hash of host groups and examples, rather than
73
+ # triggering implicit auto-inclusion in groups with matching metadata.
74
+ config.shared_context_metadata_behavior = :apply_to_host_groups
75
+ end
@@ -0,0 +1,28 @@
1
+ # Copyright (C) 2019 The University of Adelaide
2
+ #
3
+ # This file is part of Rest-Client-Wrapper.
4
+ #
5
+ # Rest-Client-Wrapper is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Rest-Client-Wrapper is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with Rest-Client-Wrapper. If not, see <http://www.gnu.org/licenses/>.
17
+ #
18
+
19
+ require "factory_bot"
20
+ require_relative "stub_helper"
21
+
22
+ RSpec.configure do |config|
23
+ config.include FactoryBot::Syntax::Methods
24
+ config.before(:suite) do
25
+ FactoryBot.find_definitions
26
+ config.include_context "stub_helper"
27
+ end
28
+ end
@@ -0,0 +1,20 @@
1
+ # Copyright (C) 2019 The University of Adelaide
2
+ #
3
+ # This file is part of Rest-Client-Wrapper.
4
+ #
5
+ # Rest-Client-Wrapper is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # Rest-Client-Wrapper is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with Rest-Client-Wrapper. If not, see <http://www.gnu.org/licenses/>.
17
+ #
18
+
19
+ RSpec.shared_context "stub_helper", { shared_context: :metadata } do
20
+ end
metadata ADDED
@@ -0,0 +1,216 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rest-client-wrapper
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.0.1
5
+ platform: ruby
6
+ authors:
7
+ - University of Adelaide
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-07-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.8'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.8.3
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.8'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.8.3
33
+ - !ruby/object:Gem::Dependency
34
+ name: oauth2
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.2'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.2'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rack
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 2.0.5
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 2.0.5
61
+ - !ruby/object:Gem::Dependency
62
+ name: rest-client
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: 2.0.2
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: 2.0.2
75
+ - !ruby/object:Gem::Dependency
76
+ name: typhoeus
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '1.0'
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: 1.0.1
85
+ type: :runtime
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '1.0'
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 1.0.1
95
+ - !ruby/object:Gem::Dependency
96
+ name: colorize
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: 0.7.0
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '0.7'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: 0.7.0
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '0.7'
115
+ - !ruby/object:Gem::Dependency
116
+ name: geminabox
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: 0.13.0
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: 0.13.0
129
+ - !ruby/object:Gem::Dependency
130
+ name: rspec
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: 3.4.0
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3.4'
139
+ type: :development
140
+ prerelease: false
141
+ version_requirements: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 3.4.0
146
+ - - "~>"
147
+ - !ruby/object:Gem::Version
148
+ version: '3.4'
149
+ description: Generic REST client wrapper
150
+ email:
151
+ - myuni.admin@adelaide.edu.au
152
+ executables: []
153
+ extensions: []
154
+ extra_rdoc_files: []
155
+ files:
156
+ - README.md
157
+ - lib/rest_client_wrapper.rb
158
+ - lib/rest_client_wrapper/authenticators/auth.rb
159
+ - lib/rest_client_wrapper/authenticators/basic.rb
160
+ - lib/rest_client_wrapper/authenticators/custom.rb
161
+ - lib/rest_client_wrapper/authenticators/oauth.rb
162
+ - lib/rest_client_wrapper/authenticators/token.rb
163
+ - lib/rest_client_wrapper/constants.rb
164
+ - lib/rest_client_wrapper/exceptions.rb
165
+ - lib/rest_client_wrapper/http.rb
166
+ - lib/rest_client_wrapper/paginators/echo.rb
167
+ - lib/rest_client_wrapper/paginators/echo_paginator.rb
168
+ - lib/rest_client_wrapper/paginators/header_link.rb
169
+ - lib/rest_client_wrapper/paginators/header_link_paginator.rb
170
+ - lib/rest_client_wrapper/paginators/paginate.rb
171
+ - lib/rest_client_wrapper/request.rb
172
+ - lib/rest_client_wrapper/response.rb
173
+ - lib/rest_client_wrapper/rest_client.rb
174
+ - lib/rest_client_wrapper/version.rb
175
+ - rest-client-wrapper.gemspec
176
+ - spec/authenticators/oauth_spec.rb
177
+ - spec/factories/request.rb
178
+ - spec/factories/response.rb
179
+ - spec/request_spec.rb
180
+ - spec/rest_client_spec.rb
181
+ - spec/spec_helper.rb
182
+ - spec/support/factory_bot.rb
183
+ - spec/support/stub_helper.rb
184
+ homepage: https://github.com/universityofadelaide/rest-client-wrapper
185
+ licenses:
186
+ - GPL 3.0
187
+ metadata:
188
+ allowed_push_host: https://rubygems.org
189
+ post_install_message:
190
+ rdoc_options: []
191
+ require_paths:
192
+ - lib
193
+ required_ruby_version: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - ">="
196
+ - !ruby/object:Gem::Version
197
+ version: 2.4.0
198
+ required_rubygems_version: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: '0'
203
+ requirements: []
204
+ rubygems_version: 3.0.4
205
+ signing_key:
206
+ specification_version: 4
207
+ summary: Rest client wrapper
208
+ test_files:
209
+ - spec/authenticators/oauth_spec.rb
210
+ - spec/factories/response.rb
211
+ - spec/factories/request.rb
212
+ - spec/request_spec.rb
213
+ - spec/rest_client_spec.rb
214
+ - spec/spec_helper.rb
215
+ - spec/support/factory_bot.rb
216
+ - spec/support/stub_helper.rb