apipie-bindings 0.0.18 → 0.0.19

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
  SHA1:
3
- metadata.gz: 4734cdf3c653d0886c206128ad15894c3d279470
4
- data.tar.gz: 747b17990ca0a2258eee7936b2040d98f7832c80
3
+ metadata.gz: 1d30b2c120a24152b99526e83b9b913b0e2cda4b
4
+ data.tar.gz: 918bb3e69af74ef55f9279dbb70f4ea1a5d33da4
5
5
  SHA512:
6
- metadata.gz: 31986fa92e0941cfd0af5560d134b75b7166f11aaf1550d4b8385adc75c7c68759f93dbfbbb0657089d064d3dff762af5321459c6240babab6e7d5687fa72fb1
7
- data.tar.gz: e7c6e55f3d160074635dc8861a93a6965d276425ef383c881ac298a3a936aaa0971b6029a10a10fe211ce7c7337347a90d10a6adee4ede59059de3cfa0c2bbed
6
+ metadata.gz: 0f64b123b50ae0183bce9d576d37263fff2fc8e0d23ab986befd8971dd0b47cb9ed341636da77dc2e9c56fda3f514744cd7acc1cc58d0f1f20917e32040ac254
7
+ data.tar.gz: b4a890d819bead44b94fb8dc916b183b480f6383171d7ba692f64667cbb112e5d081ccef7288048649df22130a75c0e634854f34af8a38d5df8de1076d8077ab
data/README.md CHANGED
@@ -33,8 +33,8 @@ irb> api.resources
33
33
  ##### Listing actions
34
34
 
35
35
  ```
36
- irb> api.resource(:architectures).actions
37
- => [<Action :index>, <Action :show>, <Action :create>, <Action :update>, <Action :destroy>]
36
+ irb> api.resource(:roles).actions
37
+ => [<Action roles:index>, <Action roles:show>, <Action roles:create>, <Action roles:update>, <Action roles:destroy>]
38
38
  ```
39
39
 
40
40
  ##### Listing routes
data/doc/release_notes.md CHANGED
@@ -1,6 +1,11 @@
1
1
  Release notes
2
2
  =============
3
3
 
4
+ ### 0.0.19 (2016-12-09)
5
+ * Support for more advanced authentication algorithms ([PR #52](https://github.com/theforeman/apipie-bindings/pull/52))
6
+ * Show resource when inspecting Action ([PR #50](https://github.com/theforeman/apipie-bindings/pull/50))
7
+ * Prevent rest-client timeout deprecation warnings ([PR #53](https://github.com/theforeman/apipie-bindings/pull/53))
8
+
4
9
  ### 0.0.18 (2016-08-31)
5
10
  * Recover from exception while inspecting error response ([#48](https://github.com/Apipie/apipie-bindings/issues/48))
6
11
  * Add yard docs for ApipieBindings::Resource class ([#47](https://github.com/Apipie/apipie-bindings/issues/47))
@@ -108,7 +108,7 @@ module ApipieBindings
108
108
  end
109
109
 
110
110
  def to_s
111
- "<Action :#{@name}>"
111
+ "<Action #{@resource}:#{@name}>"
112
112
  end
113
113
 
114
114
  def inspect
@@ -42,9 +42,10 @@ module ApipieBindings
42
42
  # if the local cache of API description (JSON) is up to date. By default it is checked
43
43
  # *after* each API request
44
44
  # @option config [Object] :logger (Logger.new(STDERR)) custom logger class
45
- # @option config [Number] :timeout API request timeout in seconds
45
+ # @option config [Number] :timeout API request timeout in seconds, use -1 to disable timeout
46
46
  # @option config [Symbol] :follow_redirects (:default) Possible values are :always, :never and :default.
47
47
  # The :default is to only redirect in GET and HEAD requests (RestClient default)
48
+ # @option config [AbstractAuthenticator] :authenticator API request authenticator
48
49
  # @param [Hash] options params that are passed to ResClient as-is
49
50
  # @raise [ApipieBindings::ConfigurationError] when no +:uri+ or +:apidoc_cache_dir+ is provided
50
51
  # @example connect to a server
@@ -88,8 +89,15 @@ module ApipieBindings
88
89
  log.debug "Global headers: #{inspect_data(headers)}"
89
90
  log.debug "Follow redirects: #{@follow_redirects.to_s}"
90
91
 
91
- @credentials = config[:credentials] if config[:credentials] && config[:credentials].respond_to?(:to_params)
92
+ if config[:authenticator]
93
+ @authenticator = config[:authenticator]
94
+ else
95
+ @authenticator = legacy_authenticator(config)
96
+ end
92
97
 
98
+ if (config[:timeout] && config[:timeout].to_i < 0)
99
+ config[:timeout] = (RestClient.version < '1.7.0') ? -1 : nil
100
+ end
93
101
  @resource_config = {
94
102
  :timeout => config[:timeout],
95
103
  :headers => headers,
@@ -112,8 +120,7 @@ module ApipieBindings
112
120
  end
113
121
 
114
122
  def clear_credentials
115
- @client_with_auth = nil
116
- @credentials.clear if @credentials
123
+ @authenticator.clear if @authenticator && @authenticator.respond_to?(:clear)
117
124
  end
118
125
 
119
126
  def apidoc
@@ -215,14 +222,14 @@ module ApipieBindings
215
222
  ex = options[:fake_response ] || empty_response
216
223
  response = create_fake_response(ex.status, ex.response, http_method, URI.join(@uri || 'http://example.com', path).to_s, args)
217
224
  else
225
+ apidoc_without_auth = (path =~ /\/apidoc\//) && !@apidoc_authenticated
226
+ authenticate = options[:with_authentication].nil? ? !apidoc_without_auth : options[:with_authentication]
218
227
  begin
219
- apidoc_without_auth = (path =~ /\/apidoc\//) && !@apidoc_authenticated
220
- authenticate = options[:with_authentication].nil? ? !apidoc_without_auth : options[:with_authentication]
221
228
  client = authenticate ? authenticated_client : unauthenticated_client
222
229
  response = call_client(client, path, args)
223
230
  update_cache(response.headers[:apipie_checksum])
224
231
  rescue => e
225
- clear_credentials if e.is_a? RestClient::Unauthorized
232
+ @authenticator.error(e) if authenticate && @authenticator
226
233
  log.error e.message
227
234
  log.debug inspect_data(e)
228
235
  raise
@@ -288,6 +295,19 @@ module ApipieBindings
288
295
 
289
296
  private
290
297
 
298
+ def legacy_authenticator(config)
299
+ if config[:user] || config[:password]
300
+ Authenticators::BasicAuth.new(config[:user], config[:password])
301
+ elsif config[:credentials] && config[:credentials].respond_to?(:to_params)
302
+ log.warn("Credentials are now deprecated, use custom authenticator instead.")
303
+ Authenticators::CredentialsLegacy.new(config[:credentials])
304
+ elsif config[:oauth]
305
+ log.warn("Passing oauth credentials in hash is now deprecated, use oauth authenticator instead.")
306
+ oauth = config[:oauth]
307
+ Authenticators::Oauth.new(oauth[:consumer_key], oauth[:consumer_secret], oauth[:options])
308
+ end
309
+ end
310
+
291
311
  def call_client(client, path, args)
292
312
  block = rest_client_call_block
293
313
  client[path].send(*args, &block)
@@ -298,6 +318,8 @@ module ApipieBindings
298
318
  # include request for rest_client < 1.8.0
299
319
  response.request ||= request
300
320
 
321
+ request.args[:authenticator].response(response) if request && request.args[:authenticator]
322
+
301
323
  if [301, 302, 307].include?(response.code) && [:always, :never].include?(@follow_redirects)
302
324
  if @follow_redirects == :always
303
325
  log.debug "Response redirected to #{response.headers[:location]}"
@@ -325,22 +347,23 @@ module ApipieBindings
325
347
  end
326
348
 
327
349
  def authenticated_client
328
- unless @client_with_auth
329
- resource_config = @resource_config.merge({
330
- :user => @config[:username],
331
- :password => @config[:password],
332
- :oauth => @config[:oauth],
333
- })
334
- resource_config.merge!(@credentials.to_params) if @credentials
335
- @client_with_auth = RestClient::Resource.new(@config[:uri], resource_config)
336
- end
337
- @client_with_auth
350
+ resource_config = @resource_config.dup
351
+ resource_config[:authenticator] = get_authenticator
352
+
353
+ log.debug "Using authenticator: #{resource_config[:authenticator].name}"
354
+
355
+ RestClient::Resource.new(@config[:uri], resource_config)
338
356
  end
339
357
 
340
358
  def unauthenticated_client
341
359
  @client_without_auth ||= RestClient::Resource.new(@config[:uri], @resource_config)
342
360
  end
343
361
 
362
+ def get_authenticator
363
+ raise ApipieBindings::AuthenticatorMissingError if @authenticator.nil?
364
+ @authenticator
365
+ end
366
+
344
367
  def retrieve_apidoc_call(path, options={})
345
368
  begin
346
369
  http_call('get', path, {},
@@ -0,0 +1,18 @@
1
+ module ApipieBindings
2
+ module Authenticators
3
+ class Base
4
+ def authenticate(request, args)
5
+ end
6
+
7
+ def error(ex)
8
+ end
9
+
10
+ def response(r)
11
+ end
12
+
13
+ def name
14
+ self.class.name
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ require 'apipie_bindings/authenticators/base'
2
+
3
+ module ApipieBindings
4
+ module Authenticators
5
+ class BasicAuth < Base
6
+ def initialize(user, password)
7
+ @user = user
8
+ @password = password
9
+ end
10
+
11
+ def authenticate(request, args)
12
+ request.basic_auth(@user, @password)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,24 @@
1
+ require 'apipie_bindings/authenticators/base'
2
+
3
+ module ApipieBindings
4
+ module Authenticators
5
+ class CredentialsLegacy < Base
6
+ def initialize(credentials)
7
+ @credentials = credentials
8
+ end
9
+
10
+ def authenticate(request, args)
11
+ params = @credentials.to_params
12
+ request.basic_auth(params[:user], params[:password])
13
+ end
14
+
15
+ def error(ex)
16
+ @credentials.clear if ex.is_a? RestClient::Unauthorized
17
+ end
18
+
19
+ def clear
20
+ @credentials.clear
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,27 @@
1
+ require 'apipie_bindings/authenticators/base'
2
+
3
+ module ApipieBindings
4
+ module Authenticators
5
+ class Oauth < Base
6
+ def initialize(consumer_key, consumer_secret, options = {})
7
+ @consumer_key = consumer_key
8
+ @consumer_secret = consumer_secret
9
+ @options = options
10
+ end
11
+
12
+ def authenticate(request, args)
13
+ uri = URI.parse args[:url]
14
+ default_options = {
15
+ :site => "#{uri.scheme}://#{uri.host}:#{uri.port.to_s}",
16
+ :request_token_path => "",
17
+ :authorize_path => "",
18
+ :access_token_path => ""
19
+ }
20
+ options = default_options.merge(@options)
21
+ consumer = OAuth::Consumer.new(@consumer_key, @consumer_secret, options)
22
+
23
+ consumer.sign!(request)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ require 'apipie_bindings/authenticators/basic_auth'
2
+ require 'apipie_bindings/authenticators/credentials_legacy'
3
+ require 'apipie_bindings/authenticators/oauth'
@@ -2,6 +2,7 @@ module ApipieBindings
2
2
 
3
3
  class ConfigurationError < StandardError; end
4
4
  class DocLoadingError < StandardError; end
5
+ class AuthenticatorMissingError < StandardError; end
5
6
 
6
7
  ErrorData = Struct.new(:kind, :argument, :details)
7
8
 
@@ -9,26 +9,14 @@ module ApipieBindings
9
9
  RestClient::AbstractResponse.send(:include, RequestAccessor) unless RestClient::AbstractResponse.method_defined?(:request)
10
10
  RestClient::Response.send(:include, RequestAccessor) unless RestClient::Response.method_defined?(:request)
11
11
 
12
- unless RestClient.const_defined? :OAUTH_EXTENSION
13
- RestClient::OAUTH_EXTENSION = lambda do |request, args|
14
- if args[:oauth]
15
- uri = URI.parse args[:url]
16
- default_options = {
17
- :site => "#{uri.scheme}://#{uri.host}:#{uri.port.to_s}",
18
- :request_token_path => "",
19
- :authorize_path => "",
20
- :access_token_path => ""
21
- }
22
- options = default_options.merge args[:oauth][:options] || { }
23
- consumer = OAuth::Consumer.new(args[:oauth][:consumer_key], args[:oauth][:consumer_secret], options)
24
-
25
- consumer.sign!(request)
26
- end
12
+ unless RestClient.const_defined? :AUTHENTICATOR_EXTENSION
13
+ RestClient::AUTHENTICATOR_EXTENSION = lambda do |request, args|
14
+ args[:authenticator].authenticate(request, args) if args[:authenticator]
27
15
  end
28
16
  end
29
17
 
30
- unless RestClient.before_execution_procs.include? RestClient::OAUTH_EXTENSION
31
- RestClient.add_before_execution_proc &RestClient::OAUTH_EXTENSION
18
+ unless RestClient.before_execution_procs.include? RestClient::AUTHENTICATOR_EXTENSION
19
+ RestClient.add_before_execution_proc &RestClient::AUTHENTICATOR_EXTENSION
32
20
  end
33
21
  end
34
22
  end
@@ -1,5 +1,5 @@
1
1
  module ApipieBindings
2
2
  def self.version
3
- @version ||= Gem::Version.new '0.0.18'
3
+ @version ||= Gem::Version.new '0.0.19'
4
4
  end
5
5
  end
@@ -5,6 +5,7 @@ require 'apipie_bindings/credentials'
5
5
  require 'apipie_bindings/exceptions'
6
6
  require 'apipie_bindings/inflector'
7
7
  require 'apipie_bindings/indifferent_hash'
8
+ require 'apipie_bindings/authenticators'
8
9
  require 'apipie_bindings/api'
9
10
  require 'apipie_bindings/resource'
10
11
  require 'apipie_bindings/action'
@@ -118,11 +118,11 @@ describe ApipieBindings::Action do
118
118
 
119
119
  it "should have name visible in puts" do
120
120
  out, err = capture_io { puts resource.action(:index) }
121
- out.must_equal "<Action :index>\n"
121
+ out.must_equal "<Action users:index>\n"
122
122
  end
123
123
 
124
124
  it "should have name visible in inspect" do
125
- resource.action(:index).inspect.must_equal "<Action :index>"
125
+ resource.action(:index).inspect.must_equal "<Action users:index>"
126
126
  end
127
127
 
128
128
  it "should have examples" do
@@ -207,7 +207,7 @@ describe ApipieBindings::API do
207
207
  end
208
208
  end
209
209
 
210
- context "credentials" do
210
+ context "authenticators" do
211
211
 
212
212
  let(:fake_empty_response) {
213
213
  data = ApipieBindings::Example.new('', '', '', 200, '[]')
@@ -222,19 +222,104 @@ describe ApipieBindings::API do
222
222
  RestClient::Response.create(data.response, net_http_resp, {})
223
223
  end
224
224
  }
225
+ let(:authenticator) { stub(:name => :auth) }
226
+
227
+ def binding_params(cache_dir, params = {})
228
+ base_params = {
229
+ :uri => 'http://example.com',
230
+ :api_version => 2,
231
+ :apidoc_cache_base_dir => cache_dir,
232
+ :authenticator => authenticator
233
+ }
234
+ base_params.merge(params)
235
+ end
225
236
 
226
- it "should call credentials to_param when :credentials are set and doing authenticated call" do
227
- Dir.mktmpdir do |dir|
228
- credentials = ApipieBindings::AbstractCredentials.new
229
- api = ApipieBindings::API.new({
230
- :uri => 'http://example.com', :apidoc_cache_base_dir => dir, :api_version => 2,
231
- :credentials => credentials})
232
- credentials.expects(:to_params).returns({:password => 'xxx'})
233
- api.stubs(:call_client).returns(fake_empty_response)
237
+ context "when doing authenticated call" do
238
+ it "passes authenticator to the client" do
239
+ Dir.mktmpdir do |dir|
240
+ api = ApipieBindings::API.new(binding_params(dir))
241
+ api.expects(:call_client).with do |client, path, args|
242
+ client.options[:authenticator] == authenticator
243
+ end.returns(fake_empty_response)
244
+
245
+ api.http_call(:get, '/path')
246
+ end
247
+ end
248
+
249
+ it "passes error to authenticator" do
250
+ Dir.mktmpdir do |dir|
251
+ api = ApipieBindings::API.new(binding_params(dir))
252
+ api.stubs(:call_client).raises(RestClient::Unauthorized)
253
+ authenticator.expects(:error).with do |e|
254
+ e.is_a? RestClient::Unauthorized
255
+ end
256
+ assert_raises RestClient::Unauthorized do
257
+ api.http_call(:get, '/path')
258
+ end
259
+ end
260
+ end
261
+
262
+ it "raises exception when authenticator wasn't provided" do
263
+ Dir.mktmpdir do |dir|
264
+ api = ApipieBindings::API.new(binding_params(dir, :authenticator => nil))
265
+
266
+ assert_raises ApipieBindings::AuthenticatorMissingError do
267
+ api.http_call(:get, '/path')
268
+ end
269
+ end
270
+ end
271
+ end
272
+
273
+ context "when :apidoc_authenticated => false" do
274
+ it "doesn't pass request to authenticator" do
275
+ Dir.mktmpdir do |dir|
276
+ api = ApipieBindings::API.new(binding_params(dir, :apidoc_authenticated => false))
277
+ api.expects(:unauthenticated_client)
278
+ api.stubs(:call_client).returns(fake_empty_response)
279
+
280
+ api.check_cache
281
+ end
282
+ end
234
283
 
235
- api.http_call(:get, '/path')
284
+ it "doesn't pass error to authenticator" do
285
+ Dir.mktmpdir do |dir|
286
+ api = ApipieBindings::API.new(binding_params(dir, :apidoc_authenticated => false))
287
+ api.expects(:unauthenticated_client)
288
+ api.stubs(:call_client).raises(RestClient::Unauthorized)
289
+
290
+ authenticator.expects(:error).never
291
+ api.check_cache
292
+ end
293
+ end
294
+
295
+ it "doesn't pass response to authenticator" do
296
+ Dir.mktmpdir do |dir|
297
+ api = ApipieBindings::API.new(binding_params(dir, :apidoc_authenticated => false))
298
+ api.expects(:unauthenticated_client)
299
+ api.stubs(:call_client).returns(fake_empty_response)
300
+
301
+ authenticator.expects(:response).never
302
+ api.check_cache
303
+ end
236
304
  end
237
305
  end
306
+ end
307
+
308
+ context "credentials" do
309
+
310
+ let(:fake_empty_response) {
311
+ data = ApipieBindings::Example.new('', '', '', 200, '[]')
312
+ net_http_resp = Net::HTTPResponse.new(1.0, data.status, "")
313
+ if RestClient.version >= '2.0.0'
314
+ RestClient::Response.create(data.response, net_http_resp,
315
+ RestClient::Request.new(:method=>'GET', :url=>'http://example.com'))
316
+ elsif RestClient.version >= '1.8.0'
317
+ RestClient::Response.create(data.response, net_http_resp, {},
318
+ RestClient::Request.new(:method=>'GET', :url=>'http://example.com'))
319
+ else
320
+ RestClient::Response.create(data.response, net_http_resp, {})
321
+ end
322
+ }
238
323
 
239
324
  it "should not require credentials for loading apidoc when :apidoc_authenticated => false" do
240
325
  Dir.mktmpdir do |dir|
@@ -276,7 +361,7 @@ describe ApipieBindings::API do
276
361
  credentials = ApipieBindings::AbstractCredentials.new
277
362
  api = ApipieBindings::API.new({:uri => 'http://example.com', :apidoc_cache_base_dir => dir, :api_version => 2,
278
363
  :credentials => credentials})
279
- api.expects(:clear_credentials)
364
+ credentials.expects(:clear)
280
365
  api.stubs(:call_client).raises(RestClient::Unauthorized)
281
366
  assert_raises RestClient::Unauthorized do
282
367
  api.http_call(:get, '/path')
@@ -0,0 +1,17 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper')
2
+ require 'apipie_bindings/authenticators/basic_auth'
3
+
4
+ describe ApipieBindings::Authenticators::BasicAuth do
5
+ let(:authenticator) { ApipieBindings::Authenticators::BasicAuth.new(user, passwd) }
6
+ let(:user) { 'john_doe' }
7
+ let(:passwd) { 'secret_password' }
8
+ let(:request) { mock() }
9
+ let(:args) { {} }
10
+
11
+ describe '#authenticate' do
12
+ it 'adds base auth to the request' do
13
+ request.expects(:basic_auth).with(user, passwd)
14
+ authenticator.authenticate(request, args)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,34 @@
1
+ require File.join(File.dirname(__FILE__), '../test_helper')
2
+ require 'apipie_bindings/authenticators/credentials_legacy'
3
+
4
+ describe ApipieBindings::Authenticators::CredentialsLegacy do
5
+ let(:authenticator) { ApipieBindings::Authenticators::CredentialsLegacy.new(@credentials) }
6
+ let(:user) { 'john_doe' }
7
+ let(:passwd) { 'secret_password' }
8
+ let(:request) { mock() }
9
+ let(:args) { {} }
10
+
11
+ before do
12
+ @credentials = mock()
13
+ end
14
+
15
+ describe '#authenticate' do
16
+ it 'uses result of to_params for base auth of the request' do
17
+ @credentials.expects(:to_params).returns({ :user => user, :password => passwd })
18
+ request.expects(:basic_auth).with(user, passwd)
19
+ authenticator.authenticate(request, args)
20
+ end
21
+ end
22
+
23
+ describe '#error' do
24
+ it 'clears credentials on RestClient::Unauthorized' do
25
+ @credentials.expects(:clear)
26
+ authenticator.error(RestClient::Unauthorized.new)
27
+ end
28
+
29
+ it 'lets other errors pass' do
30
+ authenticator.error(RuntimeError.new)
31
+ end
32
+ end
33
+
34
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: apipie-bindings
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.18
4
+ version: 0.0.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Bačovský
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-31 00:00:00.000000000 Z
11
+ date: 2016-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -162,8 +162,10 @@ dependencies:
162
162
  - - "<"
163
163
  - !ruby/object:Gem::Version
164
164
  version: 2.0.0
165
- description: |
166
- Bindings for API calls that are documented with Apipie. Bindings are generated on the fly.
165
+ description: 'Bindings for API calls that are documented with Apipie. Bindings are
166
+ generated on the fly.
167
+
168
+ '
167
169
  email: mbacovsk@redhat.com
168
170
  executables: []
169
171
  extensions: []
@@ -178,6 +180,11 @@ files:
178
180
  - lib/apipie_bindings.rb
179
181
  - lib/apipie_bindings/action.rb
180
182
  - lib/apipie_bindings/api.rb
183
+ - lib/apipie_bindings/authenticators.rb
184
+ - lib/apipie_bindings/authenticators/base.rb
185
+ - lib/apipie_bindings/authenticators/basic_auth.rb
186
+ - lib/apipie_bindings/authenticators/credentials_legacy.rb
187
+ - lib/apipie_bindings/authenticators/oauth.rb
181
188
  - lib/apipie_bindings/credentials.rb
182
189
  - lib/apipie_bindings/example.rb
183
190
  - lib/apipie_bindings/exceptions.rb
@@ -218,6 +225,8 @@ files:
218
225
  - test/dummy/public/index.html
219
226
  - test/unit/action_test.rb
220
227
  - test/unit/api_test.rb
228
+ - test/unit/authenticators/basic_auth_test.rb
229
+ - test/unit/authenticators/credentials_legacy_test.rb
221
230
  - test/unit/data/dummy.json
222
231
  - test/unit/example_test.rb
223
232
  - test/unit/indifferent_hash_test.rb
@@ -247,7 +256,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
247
256
  version: '0'
248
257
  requirements: []
249
258
  rubyforge_project:
250
- rubygems_version: 2.4.8
259
+ rubygems_version: 2.5.1
251
260
  signing_key:
252
261
  specification_version: 4
253
262
  summary: The Ruby bindings for Apipie documented APIs
@@ -281,6 +290,8 @@ test_files:
281
290
  - test/dummy/public/index.html
282
291
  - test/unit/action_test.rb
283
292
  - test/unit/api_test.rb
293
+ - test/unit/authenticators/basic_auth_test.rb
294
+ - test/unit/authenticators/credentials_legacy_test.rb
284
295
  - test/unit/data/dummy.json
285
296
  - test/unit/example_test.rb
286
297
  - test/unit/indifferent_hash_test.rb
@@ -290,4 +301,3 @@ test_files:
290
301
  - test/unit/resource_test.rb
291
302
  - test/unit/route_test.rb
292
303
  - test/unit/test_helper.rb
293
- has_rdoc: yard