doorkeeper-sequel 1.5.0 → 2.0.0

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: 553728671816109cbf8e780da862de70222768b0
4
- data.tar.gz: c241ff98bec1bef3de150659beebcc4b73853ad4
3
+ metadata.gz: d016a084c8970dfd895fb289df936babf93c5fa9
4
+ data.tar.gz: 79e8e295db71fee33e9112463f41b7bd63cf4711
5
5
  SHA512:
6
- metadata.gz: d98ed140d5c131fbfc3d1967199c1a664baf9e6f2d2e398415fe52ad3e316c599f524bf6f058d9bbdd85c3f11cc17544a3eef7f78f41c39a63b86c8bb47c1225
7
- data.tar.gz: 9fb3f5c993b40d5ef0a85dfe6ffbbd5b806ed74c5f3adaeb51429c8fbbe0f78a6f01c6de0de7f2633fe88ab00f260d595a1567d41a777547a4f3952924fdacdb
6
+ metadata.gz: e654a464b6f0d2e7ef2d4ab81bbb2b2709a32fa847971dd4deca85052dc4055bcda4a270065a006f438fa9713abc8490d02d4da3086f79d9afca31e4e703a8c7
7
+ data.tar.gz: cfc5de44d6bc888d76f5041f7e9f4c4cc11dac6aefbeb4e4f3eb087eea73b7f926c5a561286931451912816b5fa0fa8cb8350b029959e5c3919d4b5419a536f7
data/.gitignore CHANGED
@@ -10,3 +10,4 @@ log/*.log
10
10
  gemfiles/*.lock
11
11
  Gemfile.lock
12
12
  doorkeeper-sequel-*.gem
13
+ coverage
@@ -1,4 +1,3 @@
1
1
  [submodule "doorkeeper"]
2
2
  path = doorkeeper
3
3
  url = https://github.com/doorkeeper-gem/doorkeeper.git
4
- branch = 4.4.0
@@ -1,14 +1,20 @@
1
- # Doorkeeper-Sequel ORM 1.x Changelog
1
+ # Doorkeeper-Sequel ORM Changelog
2
2
 
3
3
  Reverse Chronological Order:
4
4
 
5
5
  ## master
6
6
 
7
- https://github.com/nbulaj/doorkeeper-sequel/compare/1.3.2...master
7
+ https://github.com/nbulaj/doorkeeper-sequel/compare/2.0.0...master
8
+
9
+ ## `2.0.0` (2018-10-04)
10
+
11
+ https://github.com/nbulaj/doorkeeper-sequel/compare/1.5.0...2.0.0
12
+
13
+ * Support Doorkeeper >= 5.0.0
8
14
 
9
15
  ## `1.5.0` (2018-10-03)
10
16
 
11
- https://github.com/nbulaj/doorkeeper-sequel/compare/1.5.0...1.4.0
17
+ https://github.com/nbulaj/doorkeeper-sequel/compare/1.4.0...1.5.0
12
18
 
13
19
  * Support Doorkeeper >= 4.2.7 && < 5.0.0
14
20
 
data/README.md CHANGED
@@ -17,8 +17,13 @@
17
17
  To start using the Doorkeeper Sequel ORM, add to your Gemfile:
18
18
 
19
19
  ``` ruby
20
- gem 'doorkeeper', '~> 4.0'
21
- gem 'doorkeeper-sequel', '~> 1.4'
20
+ # For Doorkeeper 4.x
21
+ gem 'doorkeeper', '~> 4.3'
22
+ gem 'doorkeeper-sequel', '~> 1.5'
23
+
24
+ # For Doorkeeper 5.x
25
+ gem 'doorkeeper', '~> 5.0'
26
+ gem 'doorkeeper-sequel', '~> 2.0'
22
27
  ```
23
28
 
24
29
  Or you can use git `master` branch for the latest gem version:
@@ -42,6 +47,7 @@ rake doorkeeper_sequel:generate:migration
42
47
  rake doorkeeper_sequel:generate:application_owner
43
48
  rake doorkeeper_sequel:generate:previous_refresh_token
44
49
  rake doorkeeper_sequel:generate:confidential_applications # for Doorkeeper >= 4.4
50
+ rake doorkeeper_sequel:generate:pkce # for Doorkeeper >= 5.x
45
51
  ```
46
52
 
47
53
  ## Tests
data/Rakefile CHANGED
@@ -26,6 +26,7 @@ class ExtensionIntegrator
26
26
 
27
27
  def copy_spec_stubs!
28
28
  FileUtils.cp_r('spec/stubs/spec_helper_integration.rb', 'spec/spec_helper_integration.rb')
29
+ FileUtils.cp_r('spec/stubs/spec_helper_integration.rb', 'spec/spec_helper.rb')
29
30
  FileUtils.cp_r('spec/stubs/models/user.rb', 'spec/dummy/app/models/user.rb')
30
31
  FileUtils.cp_r('spec/stubs/config/initializers/db.rb', 'spec/dummy/config/initializers/db.rb')
31
32
  FileUtils.cp_r('spec/stubs/config/application.rb', 'spec/dummy/config/application.rb')
@@ -33,6 +34,7 @@ class ExtensionIntegrator
33
34
  FileUtils.rm('spec/dummy/config/initializers/active_record_belongs_to_required_by_default.rb', force: true)
34
35
  FileUtils.rm('spec/dummy/config/initializers/new_framework_defaults.rb', force: true)
35
36
  FileUtils.rm('spec/models/doorkeeper/base_record_spec.rb', force: true)
37
+ FileUtils.rm('spec/lib/orm/active_record/stale_records_cleaner_spec.rb', force: true)
36
38
  # Remove generators specs because we are using our own
37
39
  FileUtils.rm(Dir.glob('spec/generators/*.rb'))
38
40
  end
@@ -15,3 +15,5 @@ en:
15
15
  relative_uri: 'must be an absolute URI.'
16
16
  secured_uri: 'must be an HTTPS/SSL URI.'
17
17
  forbidden_uri: 'is forbidden by the server.'
18
+ scopes:
19
+ not_match_configured: "doesn't match configured on the server."
@@ -20,11 +20,12 @@ Gem::Specification.new do |gem|
20
20
 
21
21
  gem.required_ruby_version = '>= 2.0.0'
22
22
 
23
- gem.add_runtime_dependency 'doorkeeper', '>= 4.2.6', '< 5.0'
23
+ gem.add_runtime_dependency 'doorkeeper', '>= 5.0.0'
24
24
  gem.add_runtime_dependency 'sequel', '>= 4.0.0', '< 6'
25
25
  gem.add_runtime_dependency 'sequel_polymorphic', '~> 0.2', '< 1.0'
26
26
  gem.add_runtime_dependency 'thor', '>= 0.18', '< 6'
27
27
 
28
+ gem.add_development_dependency 'coveralls'
28
29
  gem.add_development_dependency 'grape'
29
30
  gem.add_development_dependency 'capybara', '~> 2.14', '>= 2.14.0'
30
31
  gem.add_development_dependency 'database_cleaner', '~> 1.5', '>= 1.5.0'
@@ -4,8 +4,8 @@ module DoorkeeperSequel
4
4
  end
5
5
 
6
6
  module VERSION
7
- MAJOR = 1
8
- MINOR = 5
7
+ MAJOR = 2
8
+ MINOR = 0
9
9
  TINY = 0
10
10
 
11
11
  STRING = [MAJOR, MINOR, TINY].compact.join('.')
@@ -0,0 +1,14 @@
1
+ module DoorkeeperSequel
2
+ class PkceGenerator < ::Thor::Group
3
+ include ::Thor::Actions
4
+ include MigrationActions
5
+
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ desc 'Provide support for PKCE.'
9
+
10
+ def install
11
+ create_migration 'enable_pkce_migration.rb.erb'
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,8 @@
1
+ Sequel.migration do
2
+ change do
3
+ alter_table(:oauth_access_grants) do
4
+ add_column :code_challenge, Integer, null: true
5
+ add_column :code_challenge_method, String, null: true
6
+ end
7
+ end
8
+ end
@@ -16,7 +16,7 @@ module DoorkeeperSequel
16
16
  many_to_one :application, class: 'Doorkeeper::Application'
17
17
 
18
18
  set_allowed_columns :resource_owner_id, :application_id,
19
- :expires_in, :redirect_uri, :scopes
19
+ :expires_in, :redirect_uri, :scopes, :code_challenge, :code_challenge_method
20
20
 
21
21
  def before_validation
22
22
  generate_token if new?
@@ -29,12 +29,36 @@ module DoorkeeperSequel
29
29
  :token, :expires_in, :redirect_uri]
30
30
  validates_unique [:token]
31
31
  end
32
+
33
+ def uses_pkce?
34
+ pkce_supported? && code_challenge.present?
35
+ end
36
+
37
+ def pkce_supported?
38
+ respond_to? :code_challenge
39
+ end
32
40
  end
33
41
 
34
42
  module ClassMethods
35
43
  def by_token(token)
36
44
  first(token: token.to_s)
37
45
  end
46
+
47
+ def revoke_all_for(application_id, resource_owner, clock = Time)
48
+ where(application_id: application_id,
49
+ resource_owner_id: resource_owner.id,
50
+ revoked_at: nil)
51
+ .update(revoked_at: clock.now.utc)
52
+ end
53
+
54
+ def generate_code_challenge(code_verifier)
55
+ padded_result = Base64.urlsafe_encode64(Digest::SHA256.digest(code_verifier))
56
+ padded_result.split('=')[0] # Remove any trailing '='
57
+ end
58
+
59
+ def pkce_supported?
60
+ new.pkce_supported?
61
+ end
38
62
  end
39
63
 
40
64
  private
@@ -64,21 +64,29 @@ module DoorkeeperSequel
64
64
  else
65
65
  resource_owner_or_id
66
66
  end
67
- token = last_authorized_token_for(application.try(:id), resource_owner_id)
68
- if token && scopes_match?(token.scopes, scopes, application.try(:scopes))
69
- token
67
+ tokens = authorized_tokens_for(application.try(:id), resource_owner_id)
68
+ tokens.detect do |token|
69
+ scopes_match?(token.scopes, scopes, application.try(:scopes))
70
70
  end
71
71
  end
72
72
 
73
73
  def scopes_match?(token_scopes, param_scopes, app_scopes)
74
- (token_scopes.blank? && param_scopes.blank?) ||
75
- Doorkeeper::OAuth::Helpers::ScopeChecker.match?(
76
- token_scopes.to_s,
77
- param_scopes,
74
+ return true if token_scopes.empty? && param_scopes.empty?
75
+ (token_scopes.sort == param_scopes.sort) &&
76
+ Doorkeeper::OAuth::Helpers::ScopeChecker.valid?(
77
+ param_scopes.to_s,
78
+ Doorkeeper.configuration.scopes,
78
79
  app_scopes
79
80
  )
80
81
  end
81
82
 
83
+ def authorized_tokens_for(application_id, resource_owner_id)
84
+ ordered_by(:created_at, :desc).
85
+ where(application_id: application_id,
86
+ resource_owner_id: resource_owner_id,
87
+ revoked_at: nil)
88
+ end
89
+
82
90
  def find_or_create_for(application, resource_owner_id, scopes, expires_in, use_refresh_token)
83
91
  if Doorkeeper.configuration.reuse_access_token
84
92
  access_token = matching_token_for(application, resource_owner_id, scopes)
@@ -95,11 +103,7 @@ module DoorkeeperSequel
95
103
  end
96
104
 
97
105
  def last_authorized_token_for(application_id, resource_owner_id)
98
- where(application_id: application_id,
99
- resource_owner_id: resource_owner_id,
100
- revoked_at: nil)
101
- .send(order_method, created_at_desc)
102
- .first
106
+ authorized_tokens_for(application_id, resource_owner_id).first
103
107
  end
104
108
  end
105
109
 
@@ -114,8 +118,8 @@ module DoorkeeperSequel
114
118
  def as_json(_options = {})
115
119
  {
116
120
  resource_owner_id: resource_owner_id,
117
- scopes: scopes,
118
- expires_in_seconds: expires_in_seconds,
121
+ scope: scopes,
122
+ expires_in: expires_in_seconds,
119
123
  application: { uid: application.try(:uid) },
120
124
  created_at: created_at.to_i
121
125
  }
@@ -34,10 +34,27 @@ module DoorkeeperSequel
34
34
  validates_redirect_uri :redirect_uri
35
35
  validates_includes [true, false], :confidential, allow_missing: true
36
36
 
37
+ validate_scopes_match_configured if enforce_scopes?
38
+
37
39
  if respond_to?(:validate_owner?)
38
40
  validates_presence [:owner_id] if validate_owner?
39
41
  end
40
42
  end
43
+
44
+ protected
45
+
46
+ def validate_scopes_match_configured
47
+ if scopes.present? &&
48
+ !Doorkeeper::OAuth::Helpers::ScopeChecker.valid?(scopes.to_s, Doorkeeper.configuration.scopes)
49
+
50
+ scope = 'sequel.errors.models.doorkeeper/application.attributes.scopes'
51
+ errors.add(:scopes, I18n.t(:not_match_configured, scope: scope))
52
+ end
53
+ end
54
+
55
+ def enforce_scopes?
56
+ Doorkeeper.configuration.enforce_configured_scopes?
57
+ end
41
58
  end
42
59
 
43
60
  module ClassMethods
@@ -34,6 +34,12 @@ module DoorkeeperSequel
34
34
  def invalid?
35
35
  !valid?
36
36
  end
37
+
38
+ def exists?
39
+ !self.empty?
40
+ end
41
+
42
+ alias_method :exist?, :exists?
37
43
  end
38
44
 
39
45
  module ClassMethods
@@ -58,6 +64,14 @@ module DoorkeeperSequel
58
64
  super(id: args)
59
65
  end
60
66
  end
67
+
68
+ def exists?(*args)
69
+ if args.any?
70
+ !where(*args).empty?
71
+ else
72
+ !empty?
73
+ end
74
+ end
61
75
  end
62
76
  end
63
77
  end
@@ -14,5 +14,15 @@ namespace :doorkeeper_sequel do
14
14
  task :previous_refresh_token do
15
15
  DoorkeeperSequel::PreviousRefreshTokenGenerator.start
16
16
  end
17
+
18
+ desc 'Generate migration file for PKCE'
19
+ task :pkce do
20
+ DoorkeeperSequel::PkceGenerator.start
21
+ end
22
+
23
+ desc 'Add confidential column to Doorkeeper applications'
24
+ task :confidential_applications do
25
+ DoorkeeperSequel::ConfidentialApplicationsGenerator.start
26
+ end
17
27
  end
18
28
  end
@@ -1,3 +1,5 @@
1
+ require 'doorkeeper/orm/sequel/stale_records_cleaner'
2
+
1
3
  module Doorkeeper
2
4
  module Orm
3
5
  module Sequel
@@ -14,5 +14,10 @@ module Doorkeeper
14
14
  resource_access_tokens = AccessToken.active_for(resource_owner)
15
15
  where(id: resource_access_tokens.select_map(:application_id)).all
16
16
  end
17
+
18
+ def self.revoke_tokens_and_grants_for(id, resource_owner)
19
+ AccessToken.revoke_all_for(id, resource_owner)
20
+ AccessGrant.revoke_all_for(id, resource_owner)
21
+ end
17
22
  end
18
23
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Doorkeeper
4
+ module Orm
5
+ module Sequel
6
+ class StaleRecordsCleaner
7
+ def initialize(base_scope)
8
+ @base_scope = base_scope
9
+ end
10
+
11
+ def clean_revoked
12
+ @base_scope
13
+ .where(::Sequel.~(revoked_at: nil))
14
+ .where { revoked_at < Time.current }
15
+ .delete
16
+ end
17
+
18
+ def clean_expired(ttl)
19
+ @base_scope
20
+ .where { created_at < (Time.current - ttl) }
21
+ .delete
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -36,6 +36,9 @@ DB.create_table :oauth_access_grants do
36
36
  column :created_at, DateTime, null: false
37
37
  column :revoked_at, DateTime
38
38
  column :scopes, String, size: 255
39
+
40
+ column :code_challenge, String
41
+ column :code_challenge_method, String
39
42
  end
40
43
 
41
44
  DB.create_table :oauth_access_tokens do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: doorkeeper-sequel
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nikita Bulai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-03 00:00:00.000000000 Z
11
+ date: 2018-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: doorkeeper
@@ -16,20 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.2.6
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: '5.0'
19
+ version: 5.0.0
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
24
  - - ">="
28
25
  - !ruby/object:Gem::Version
29
- version: 4.2.6
30
- - - "<"
31
- - !ruby/object:Gem::Version
32
- version: '5.0'
26
+ version: 5.0.0
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: sequel
35
29
  requirement: !ruby/object:Gem::Requirement
@@ -90,6 +84,20 @@ dependencies:
90
84
  - - "<"
91
85
  - !ruby/object:Gem::Version
92
86
  version: '6'
87
+ - !ruby/object:Gem::Dependency
88
+ name: coveralls
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ type: :development
95
+ prerelease: false
96
+ version_requirements: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
93
101
  - !ruby/object:Gem::Dependency
94
102
  name: grape
95
103
  requirement: !ruby/object:Gem::Requirement
@@ -215,11 +223,13 @@ files:
215
223
  - lib/doorkeeper-sequel/generators/concerns/migration_actions.rb
216
224
  - lib/doorkeeper-sequel/generators/confidential_applications_generator.rb
217
225
  - lib/doorkeeper-sequel/generators/migration_generator.rb
226
+ - lib/doorkeeper-sequel/generators/pkce_generator.rb
218
227
  - lib/doorkeeper-sequel/generators/previous_refresh_token_generator.rb
219
228
  - lib/doorkeeper-sequel/generators/templates/add_confidential_to_application_migration.rb
220
229
  - lib/doorkeeper-sequel/generators/templates/add_owner_to_application.rb
221
230
  - lib/doorkeeper-sequel/generators/templates/add_previous_refresh_token_to_access_tokens.rb
222
231
  - lib/doorkeeper-sequel/generators/templates/create_doorkeeper_tables.rb
232
+ - lib/doorkeeper-sequel/generators/templates/enable_pkce_migration.rb
223
233
  - lib/doorkeeper-sequel/mixins/access_grant_mixin.rb
224
234
  - lib/doorkeeper-sequel/mixins/access_token_mixin.rb
225
235
  - lib/doorkeeper-sequel/mixins/application_mixin.rb
@@ -233,13 +243,15 @@ files:
233
243
  - lib/doorkeeper/orm/sequel/access_grant.rb
234
244
  - lib/doorkeeper/orm/sequel/access_token.rb
235
245
  - lib/doorkeeper/orm/sequel/application.rb
236
- - spec/controllers/application_metal_controller.rb
246
+ - lib/doorkeeper/orm/sequel/stale_records_cleaner.rb
247
+ - spec/controllers/application_metal_controller_spec.rb
237
248
  - spec/controllers/applications_controller_spec.rb
238
249
  - spec/controllers/authorizations_controller_spec.rb
239
250
  - spec/controllers/protected_resources_controller_spec.rb
240
251
  - spec/controllers/token_info_controller_spec.rb
241
252
  - spec/controllers/tokens_controller_spec.rb
242
253
  - spec/dummy/Rakefile
254
+ - spec/dummy/app/assets/config/manifest.js
243
255
  - spec/dummy/app/controllers/application_controller.rb
244
256
  - spec/dummy/app/controllers/custom_authorizations_controller.rb
245
257
  - spec/dummy/app/controllers/full_protected_resources_controller.rb
@@ -271,7 +283,8 @@ files:
271
283
  - spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb
272
284
  - spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb
273
285
  - spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb
274
- - spec/dummy/db/migrate/20180210183654_add_confidential_to_application.rb
286
+ - spec/dummy/db/migrate/20170822064514_enable_pkce.rb
287
+ - spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb
275
288
  - spec/dummy/db/schema.rb
276
289
  - spec/dummy/log/test.log
277
290
  - spec/dummy/public/404.html
@@ -280,47 +293,43 @@ files:
280
293
  - spec/dummy/public/favicon.ico
281
294
  - spec/dummy/script/rails
282
295
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/0p/0pa3wNbGHqFC6gxrMvdOJiP6gPwFv9VJ_npjEfRWxAE.cache
283
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/0x/0x7itSE_jjN9NM8w3jE4isMgaQPBrVx0prZCwBURBV0.cache
296
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/2C/2C9t8HfJg90nE6MPdwPjat-x10FoGiWgZPUw9kmsPsI.cache
284
297
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/3P/3PoguHEOEeItUjmwC74MWLLP-_Ijow7798bF5U6K2dw.cache
285
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/4Q/4QEkO7sOQsz2KI7mJWxhmltotR8iDKMhV-8Gui8l1Yo.cache
286
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/4_/4_AVHXD_fQP3S2gUiYF1Azv90b6luuMnAM0hxD901y0.cache
287
298
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/6b/6b0anrSo7Fvoc05t4Ca0zZmfS_cpERy1DsG3ea6lBOg.cache
288
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/6k/6kyl2zElqd6QNgJLE7Ej-F9Xofwmq0OiAIJTHGtoCt8.cache
289
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/9D/9DkYxrjE-y5KTPxxIo5Zs3AOaylSDDJPPWbghYbc6tA.cache
299
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/7L/7LMxo1fRhQsTzTk4HEOKaKrXZZ6W6h1y3NP1bitM7ZQ.cache
300
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/7q/7q9VgVs--Akr7g5EzfwMMjm7kzT9nfzupV_6i1iZ2UM.cache
290
301
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/BA/BAC3ZaGoeZ9Od-kKg-UQYelvRgsCa0H72-52nLdcTNw.cache
302
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/BP/BPg8R8WCRaQjKyU4cbh_OtZKlqrO3SNih8XEK6HFgt0.cache
291
303
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Bw/Bw6Nimjvy5Yv1AYbZb1t-v0eMNhv-bhwBzR-b5mY7FU.cache
304
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/E5/E5sdePtlY78DzZGK0ss7hIguFKUxwdooY8WiM3BWo3s.cache
292
305
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Fq/FqQWjMAz8yjZQlMC_dUsztaOxGruI2IXyGAAUF9SvQ0.cache
293
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/Hc/HcIx4yYPg3w0vv-Cj49orJw9fudDS4Qpe3WXtuej7MI.cache
294
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ht/HtCMc1ZaTgZy2o1DFs1PbbISOEzOsyW0aFFkquK8ywY.cache
306
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Hn/HnZczabSGuPuyZkh8kkTVR9fsNh_10o7xc5uzxcm-6Y.cache
295
307
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/J_/J_D9clwKidN28hnVB1O3zEfKDwg90Usdb5ToKiPq_aw.cache
296
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/Jg/JgpBOeANnJqUX61iOsyq9gnH5CdODzg18IvAQYJC_PE.cache
297
308
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ji/JitNKkP1dYdu9ObSdIkkEAsiFxEmRO5oy1UIyhT_hYs.cache
298
309
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Jq/JqTLVvnY2AgGkHftWPwqt_HkbwhYRsmgHxk37VqKJAY.cache
299
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/K-/K-zIshtjhzfsKunHgtf4oRnTZuW_C9lUh_vP8EuydZY.cache
300
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/LF/LF3zCtek7hbLgoNRiXnEYsN9BkXVGw5dqB2W-pALTcU.cache
310
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Pk/PkX2fMYiAxTYc9kX4pFVXseR-CdZmnpWX7GniCMQHO0.cache
301
311
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/QX/QXcp8DweOJ6BfMedGMfeHvVXv2hjDIleln1LSJk7vOE.cache
302
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/Rw/RwtI_j7fJhgLfhnUQlGxoS-oFn2XExsMONzyxeaNhQ0.cache
303
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/T3/T3h82qJsdqVlH178VSlblhU1evf9RZq83rqKMwjdRKI.cache
312
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Rg/RgtUEkFKU-oi_LZ0R-kXz4SfnJIf_pEG-BwRK2Jc0v0.cache
304
313
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ta/TaYxNn81MhqC3DnMC6_y_Q7xap5Ntn4ggFo94EUaiak.cache
305
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/Wn/WnJTlULZ65547f83Wc-LjLXHGBPvOi_0ItAaE_6SlzY.cache
314
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/W7/W7gU40NzeL-YSA7WVWNmHkpNN8cocSrXN6iD-0EJwfw.cache
306
315
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Wq/WqbLVKOcTMZtttygYt_ncr1mGIDrzevSTaPGNmzV1D8.cache
316
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Xv/Xvu9wgL0ZoJUg40hTfJ7VEhswxHSZTFqafJONsalmSo.cache
307
317
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/YF/YF60qiQ28QMoYDrLmrbHWZr7X7bl5MxVPR5QrrVCFak.cache
308
318
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Yf/YfJJZvm_NONHd4eCasDibCcRapZ_WYIO5MUxSUUbYFk.cache
309
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/Yi/YigT9tpj4dQzAx0EBR0E5d3g7wtv9X1Qw7eprYkoeNE.cache
310
319
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Z0/Z0e47cT2a-21U-w-3gkbgqC3o5jWnEzOB8vW06aJH1E.cache
320
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Z3/Z3pV6hviTFmi6L98n9tVOy94nUUt8X_dSnvO0FqTjzc.cache
321
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/_1/_1LQPrIlY8mTaxRd58w68ZBIVwaDge57_fpmw6PKGTI.cache
311
322
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/dL/dL7SLUWUIeVdyA1UuH-rvif0nzesOar3LdEtqzdb4bE.cache
312
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/f1/f11L16ip-n_en5vxM7LnyFPv_A9VDsPUKXzg-hDG0dE.cache
323
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/ej/ej1aKu26DikNnd9272jY2Y2o4C3QI2B1JdZhdPTQvA4.cache
313
324
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/f8/f8WT8jqR1qNIdQaRDpXbyLN7E5AWkbYFBwdh9Ozk7gk.cache
314
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/fX/fXlPiyPj8HG3QoJDYpup0DTLBnq8hw6Np2VeMHWKuaQ.cache
315
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/g5/g5VAxZ-YK0jKJukhexFCoUQqI2yLS1eOYNbU__THPvo.cache
316
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/hU/hUU3IwUkZwk7JZj3LvnwlHPmwPh0Dz9B2Fv0aj17VJw.cache
317
325
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/hk/hk2YB6skvc72qL4IzzQKU8Emyfe5vARjoD1bvQTw4zE.cache
318
326
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/ii/iiJRBZIsxKiwyzU_Z7UtQeUTXMRJRPTreTKRvAWO7_8.cache
319
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/lx/lxLzW5UwcFlFj1MV5uZ_icpe7sCVc6_WUMMLMqUqbzQ.cache
320
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/qS/qSc-air8Wm-UxxbdyXgOBiwA1g2VgejS3oE4CTPnUJs.cache
327
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/mx/mxO2JNHTQy9FY1xVYenKUIupjGyjFgEKhw7bF6oYCes.cache
328
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/pA/pAXzgvvIc7N1TYHmLtkgkRI_Nj58_VIMBT8CSRxDg5A.cache
321
329
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/qo/qo6SpT75QykYB63Aqq5bgzpXyNU1Y4dGFvCCJgoWQpE.cache
322
330
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/vO/vOXN0mER62j4JiPpMTSVS7MMqs0067cZx14vD5B8qiQ.cache
323
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/wC/wCg1fNgvPgN-FNalk0y-pOrMrUUVpjjG_3jLzh3J29I.cache
331
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/x1/x1j1iA1FTi7zaePBRFSuc5hzG2jhJ0Otdn8LnC-PHvU.cache
332
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/zI/zIwTd39w92Mk6c86cODQlqHM3ymkZwY8N6Ee2plkTKg.cache
324
333
  - spec/factories.rb
325
334
  - spec/generators/templates/routes.rb
326
335
  - spec/generators/tmp/dummy/app/views/doorkeeper/applications/_delete_form.html.erb
@@ -372,6 +381,7 @@ files:
372
381
  - spec/lib/oauth/token_spec.rb
373
382
  - spec/lib/request/strategy_spec.rb
374
383
  - spec/lib/server_spec.rb
384
+ - spec/lib/stale_records_cleaner_spec.rb
375
385
  - spec/models/doorkeeper/access_grant_spec.rb
376
386
  - spec/models/doorkeeper/access_token_spec.rb
377
387
  - spec/models/doorkeeper/application_spec.rb
@@ -401,7 +411,8 @@ files:
401
411
  - spec/stubs/models/user.rb
402
412
  - spec/stubs/spec_helper_integration.rb
403
413
  - spec/stubs/support/sequel.rb
404
- - spec/support/dependencies/factory_girl.rb
414
+ - spec/support/dependencies/factory_bot.rb
415
+ - spec/support/doorkeeper_rspec.rb
405
416
  - spec/support/helpers/access_token_request_helper.rb
406
417
  - spec/support/helpers/authorization_request_helper.rb
407
418
  - spec/support/helpers/config_helper.rb
@@ -457,6 +468,7 @@ test_files:
457
468
  - spec/generators/tmp/dummy/app/views/doorkeeper/applications/_form.html.erb
458
469
  - spec/generators/templates/routes.rb
459
470
  - spec/support/http_method_shim.rb
471
+ - spec/support/doorkeeper_rspec.rb
460
472
  - spec/support/shared/models_shared_examples.rb
461
473
  - spec/support/shared/controllers_shared_context.rb
462
474
  - spec/support/orm/sequel.rb
@@ -467,7 +479,7 @@ test_files:
467
479
  - spec/support/helpers/request_spec_helper.rb
468
480
  - spec/support/helpers/access_token_request_helper.rb
469
481
  - spec/support/helpers/authorization_request_helper.rb
470
- - spec/support/dependencies/factory_girl.rb
482
+ - spec/support/dependencies/factory_bot.rb
471
483
  - spec/stubs/generators/tmp/dummy/db/migrate/20170810125729_add_previous_refresh_token_to_access_tokens.rb
472
484
  - spec/stubs/support/sequel.rb
473
485
  - spec/stubs/models/user.rb
@@ -484,52 +496,49 @@ test_files:
484
496
  - spec/dummy/public/favicon.ico
485
497
  - spec/dummy/public/404.html
486
498
  - spec/dummy/public/500.html
487
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/Jg/JgpBOeANnJqUX61iOsyq9gnH5CdODzg18IvAQYJC_PE.cache
488
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/4Q/4QEkO7sOQsz2KI7mJWxhmltotR8iDKMhV-8Gui8l1Yo.cache
499
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/7L/7LMxo1fRhQsTzTk4HEOKaKrXZZ6W6h1y3NP1bitM7ZQ.cache
500
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Pk/PkX2fMYiAxTYc9kX4pFVXseR-CdZmnpWX7GniCMQHO0.cache
501
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Xv/Xvu9wgL0ZoJUg40hTfJ7VEhswxHSZTFqafJONsalmSo.cache
489
502
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/BA/BAC3ZaGoeZ9Od-kKg-UQYelvRgsCa0H72-52nLdcTNw.cache
490
503
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/hk/hk2YB6skvc72qL4IzzQKU8Emyfe5vARjoD1bvQTw4zE.cache
491
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/hU/hUU3IwUkZwk7JZj3LvnwlHPmwPh0Dz9B2Fv0aj17VJw.cache
492
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/K-/K-zIshtjhzfsKunHgtf4oRnTZuW_C9lUh_vP8EuydZY.cache
493
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/T3/T3h82qJsdqVlH178VSlblhU1evf9RZq83rqKMwjdRKI.cache
494
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/Rw/RwtI_j7fJhgLfhnUQlGxoS-oFn2XExsMONzyxeaNhQ0.cache
504
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/x1/x1j1iA1FTi7zaePBRFSuc5hzG2jhJ0Otdn8LnC-PHvU.cache
505
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/7q/7q9VgVs--Akr7g5EzfwMMjm7kzT9nfzupV_6i1iZ2UM.cache
506
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/mx/mxO2JNHTQy9FY1xVYenKUIupjGyjFgEKhw7bF6oYCes.cache
507
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/BP/BPg8R8WCRaQjKyU4cbh_OtZKlqrO3SNih8XEK6HFgt0.cache
495
508
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ta/TaYxNn81MhqC3DnMC6_y_Q7xap5Ntn4ggFo94EUaiak.cache
496
509
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Yf/YfJJZvm_NONHd4eCasDibCcRapZ_WYIO5MUxSUUbYFk.cache
497
510
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/3P/3PoguHEOEeItUjmwC74MWLLP-_Ijow7798bF5U6K2dw.cache
498
511
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Jq/JqTLVvnY2AgGkHftWPwqt_HkbwhYRsmgHxk37VqKJAY.cache
512
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Rg/RgtUEkFKU-oi_LZ0R-kXz4SfnJIf_pEG-BwRK2Jc0v0.cache
499
513
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Wq/WqbLVKOcTMZtttygYt_ncr1mGIDrzevSTaPGNmzV1D8.cache
500
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/wC/wCg1fNgvPgN-FNalk0y-pOrMrUUVpjjG_3jLzh3J29I.cache
501
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/lx/lxLzW5UwcFlFj1MV5uZ_icpe7sCVc6_WUMMLMqUqbzQ.cache
502
514
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/YF/YF60qiQ28QMoYDrLmrbHWZr7X7bl5MxVPR5QrrVCFak.cache
515
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Hn/HnZczabSGuPuyZkh8kkTVR9fsNh_10o7xc5uzxcm-6Y.cache
503
516
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/vO/vOXN0mER62j4JiPpMTSVS7MMqs0067cZx14vD5B8qiQ.cache
504
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/fX/fXlPiyPj8HG3QoJDYpup0DTLBnq8hw6Np2VeMHWKuaQ.cache
505
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/LF/LF3zCtek7hbLgoNRiXnEYsN9BkXVGw5dqB2W-pALTcU.cache
517
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/ej/ej1aKu26DikNnd9272jY2Y2o4C3QI2B1JdZhdPTQvA4.cache
518
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/E5/E5sdePtlY78DzZGK0ss7hIguFKUxwdooY8WiM3BWo3s.cache
506
519
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/f8/f8WT8jqR1qNIdQaRDpXbyLN7E5AWkbYFBwdh9Ozk7gk.cache
507
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/Yi/YigT9tpj4dQzAx0EBR0E5d3g7wtv9X1Qw7eprYkoeNE.cache
508
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/6k/6kyl2zElqd6QNgJLE7Ej-F9Xofwmq0OiAIJTHGtoCt8.cache
509
520
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/6b/6b0anrSo7Fvoc05t4Ca0zZmfS_cpERy1DsG3ea6lBOg.cache
510
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/qS/qSc-air8Wm-UxxbdyXgOBiwA1g2VgejS3oE4CTPnUJs.cache
511
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ht/HtCMc1ZaTgZy2o1DFs1PbbISOEzOsyW0aFFkquK8ywY.cache
512
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/Hc/HcIx4yYPg3w0vv-Cj49orJw9fudDS4Qpe3WXtuej7MI.cache
521
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/_1/_1LQPrIlY8mTaxRd58w68ZBIVwaDge57_fpmw6PKGTI.cache
522
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/Z3/Z3pV6hviTFmi6L98n9tVOy94nUUt8X_dSnvO0FqTjzc.cache
513
523
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Z0/Z0e47cT2a-21U-w-3gkbgqC3o5jWnEzOB8vW06aJH1E.cache
514
524
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/ii/iiJRBZIsxKiwyzU_Z7UtQeUTXMRJRPTreTKRvAWO7_8.cache
515
525
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/0p/0pa3wNbGHqFC6gxrMvdOJiP6gPwFv9VJ_npjEfRWxAE.cache
526
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/W7/W7gU40NzeL-YSA7WVWNmHkpNN8cocSrXN6iD-0EJwfw.cache
516
527
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/QX/QXcp8DweOJ6BfMedGMfeHvVXv2hjDIleln1LSJk7vOE.cache
517
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/Wn/WnJTlULZ65547f83Wc-LjLXHGBPvOi_0ItAaE_6SlzY.cache
528
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/pA/pAXzgvvIc7N1TYHmLtkgkRI_Nj58_VIMBT8CSRxDg5A.cache
518
529
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Bw/Bw6Nimjvy5Yv1AYbZb1t-v0eMNhv-bhwBzR-b5mY7FU.cache
519
530
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Fq/FqQWjMAz8yjZQlMC_dUsztaOxGruI2IXyGAAUF9SvQ0.cache
520
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/0x/0x7itSE_jjN9NM8w3jE4isMgaQPBrVx0prZCwBURBV0.cache
521
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/9D/9DkYxrjE-y5KTPxxIo5Zs3AOaylSDDJPPWbghYbc6tA.cache
522
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/g5/g5VAxZ-YK0jKJukhexFCoUQqI2yLS1eOYNbU__THPvo.cache
531
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/2C/2C9t8HfJg90nE6MPdwPjat-x10FoGiWgZPUw9kmsPsI.cache
523
532
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/J_/J_D9clwKidN28hnVB1O3zEfKDwg90Usdb5ToKiPq_aw.cache
524
533
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/dL/dL7SLUWUIeVdyA1UuH-rvif0nzesOar3LdEtqzdb4bE.cache
525
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/f1/f11L16ip-n_en5vxM7LnyFPv_A9VDsPUKXzg-hDG0dE.cache
526
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/4_/4_AVHXD_fQP3S2gUiYF1Azv90b6luuMnAM0hxD901y0.cache
527
534
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ji/JitNKkP1dYdu9ObSdIkkEAsiFxEmRO5oy1UIyhT_hYs.cache
535
+ - spec/dummy/tmp/cache/assets/sprockets/v3.0/zI/zIwTd39w92Mk6c86cODQlqHM3ymkZwY8N6Ee2plkTKg.cache
528
536
  - spec/dummy/tmp/cache/assets/sprockets/v3.0/qo/qo6SpT75QykYB63Aqq5bgzpXyNU1Y4dGFvCCJgoWQpE.cache
529
537
  - spec/dummy/app/views/home/index.html.erb
530
538
  - spec/dummy/app/views/layouts/application.html.erb
531
539
  - spec/dummy/app/models/user.rb
532
540
  - spec/dummy/app/helpers/application_helper.rb
541
+ - spec/dummy/app/assets/config/manifest.js
533
542
  - spec/dummy/app/controllers/metal_controller.rb
534
543
  - spec/dummy/app/controllers/full_protected_resources_controller.rb
535
544
  - spec/dummy/app/controllers/home_controller.rb
@@ -540,10 +549,11 @@ test_files:
540
549
  - spec/dummy/config.ru
541
550
  - spec/dummy/script/rails
542
551
  - spec/dummy/db/schema.rb
552
+ - spec/dummy/db/migrate/20170822064514_enable_pkce.rb
543
553
  - spec/dummy/db/migrate/20120312140401_add_password_to_users.rb
544
554
  - spec/dummy/db/migrate/20111122132257_create_users.rb
545
- - spec/dummy/db/migrate/20180210183654_add_confidential_to_application.rb
546
555
  - spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb
556
+ - spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb
547
557
  - spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb
548
558
  - spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb
549
559
  - spec/dummy/config/environment.rb
@@ -587,6 +597,7 @@ test_files:
587
597
  - spec/lib/models/revocable_spec.rb
588
598
  - spec/lib/server_spec.rb
589
599
  - spec/lib/doorkeeper_spec.rb
600
+ - spec/lib/stale_records_cleaner_spec.rb
590
601
  - spec/lib/config_spec.rb
591
602
  - spec/lib/oauth/code_response_spec.rb
592
603
  - spec/lib/oauth/scopes_spec.rb
@@ -620,6 +631,6 @@ test_files:
620
631
  - spec/controllers/authorizations_controller_spec.rb
621
632
  - spec/controllers/protected_resources_controller_spec.rb
622
633
  - spec/controllers/token_info_controller_spec.rb
623
- - spec/controllers/application_metal_controller.rb
634
+ - spec/controllers/application_metal_controller_spec.rb
624
635
  - spec/spec_helper.rb
625
636
  - spec/grape/grape_integration_spec.rb