doorkeeper-sequel 1.5.0 → 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.
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