doorkeeper 5.0.2 → 5.1.0.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +17 -4
  3. data/Appraisals +29 -3
  4. data/Dangerfile +5 -2
  5. data/Gemfile +14 -4
  6. data/NEWS.md +64 -19
  7. data/README.md +68 -487
  8. data/app/controllers/doorkeeper/token_info_controller.rb +1 -1
  9. data/app/controllers/doorkeeper/tokens_controller.rb +7 -7
  10. data/app/views/doorkeeper/applications/show.html.erb +1 -1
  11. data/app/views/layouts/doorkeeper/admin.html.erb +5 -3
  12. data/bin/console +15 -0
  13. data/doorkeeper.gemspec +3 -2
  14. data/gemfiles/rails_4_2.gemfile +8 -4
  15. data/gemfiles/rails_5_0.gemfile +9 -5
  16. data/gemfiles/rails_5_1.gemfile +9 -5
  17. data/gemfiles/rails_5_2.gemfile +9 -5
  18. data/gemfiles/rails_6_0.gemfile +16 -0
  19. data/gemfiles/rails_master.gemfile +8 -9
  20. data/lib/doorkeeper/config.rb +164 -11
  21. data/lib/doorkeeper/helpers/controller.rb +3 -2
  22. data/lib/doorkeeper/models/access_grant_mixin.rb +16 -1
  23. data/lib/doorkeeper/models/access_token_mixin.rb +54 -10
  24. data/lib/doorkeeper/models/application_mixin.rb +42 -1
  25. data/lib/doorkeeper/models/concerns/expirable.rb +3 -2
  26. data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
  27. data/lib/doorkeeper/models/concerns/scopes.rb +5 -1
  28. data/lib/doorkeeper/models/concerns/secret_storable.rb +106 -0
  29. data/lib/doorkeeper/oauth/authorization/code.rb +1 -1
  30. data/lib/doorkeeper/oauth/authorization/token.rb +4 -2
  31. data/lib/doorkeeper/oauth/authorization_code_request.rb +1 -1
  32. data/lib/doorkeeper/oauth/client.rb +1 -1
  33. data/lib/doorkeeper/oauth/client_credentials/validation.rb +4 -3
  34. data/lib/doorkeeper/oauth/code_response.rb +2 -2
  35. data/lib/doorkeeper/oauth/error_response.rb +5 -1
  36. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +23 -8
  37. data/lib/doorkeeper/oauth/helpers/unique_token.rb +12 -1
  38. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +32 -0
  39. data/lib/doorkeeper/oauth/invalid_token_response.rb +4 -0
  40. data/lib/doorkeeper/oauth/password_access_token_request.rb +7 -2
  41. data/lib/doorkeeper/oauth/pre_authorization.rb +8 -3
  42. data/lib/doorkeeper/oauth/refresh_token_request.rb +4 -1
  43. data/lib/doorkeeper/oauth/token_introspection.rb +72 -6
  44. data/lib/doorkeeper/oauth/token_response.rb +2 -2
  45. data/lib/doorkeeper/orm/active_record/access_grant.rb +23 -2
  46. data/lib/doorkeeper/orm/active_record/application.rb +20 -2
  47. data/lib/doorkeeper/secret_storing/base.rb +63 -0
  48. data/lib/doorkeeper/secret_storing/bcrypt.rb +59 -0
  49. data/lib/doorkeeper/secret_storing/plain.rb +33 -0
  50. data/lib/doorkeeper/secret_storing/sha256_hash.rb +25 -0
  51. data/lib/doorkeeper/version.rb +3 -3
  52. data/lib/doorkeeper.rb +7 -0
  53. data/lib/generators/doorkeeper/templates/initializer.rb +90 -8
  54. data/spec/controllers/application_metal_controller_spec.rb +18 -4
  55. data/spec/controllers/authorizations_controller_spec.rb +3 -3
  56. data/spec/controllers/token_info_controller_spec.rb +1 -1
  57. data/spec/controllers/tokens_controller_spec.rb +85 -41
  58. data/spec/dummy/app/controllers/application_controller.rb +1 -1
  59. data/spec/dummy/config/application.rb +12 -1
  60. data/spec/factories.rb +3 -3
  61. data/spec/lib/config_spec.rb +168 -0
  62. data/spec/lib/models/expirable_spec.rb +12 -0
  63. data/spec/lib/models/reusable_spec.rb +40 -0
  64. data/spec/lib/models/scopes_spec.rb +13 -1
  65. data/spec/lib/models/secret_storable_spec.rb +113 -0
  66. data/spec/lib/oauth/authorization_code_request_spec.rb +18 -1
  67. data/spec/lib/oauth/base_request_spec.rb +7 -7
  68. data/spec/lib/oauth/client_credentials/creator_spec.rb +51 -7
  69. data/spec/lib/oauth/client_credentials/validation_spec.rb +3 -0
  70. data/spec/lib/oauth/error_response_spec.rb +7 -1
  71. data/spec/lib/oauth/helpers/scope_checker_spec.rb +52 -17
  72. data/spec/lib/oauth/helpers/uri_checker_spec.rb +20 -2
  73. data/spec/lib/oauth/password_access_token_request_spec.rb +43 -12
  74. data/spec/lib/oauth/pre_authorization_spec.rb +24 -0
  75. data/spec/lib/oauth/token_request_spec.rb +16 -1
  76. data/spec/lib/oauth/token_response_spec.rb +13 -13
  77. data/spec/lib/oauth/token_spec.rb +14 -0
  78. data/spec/lib/secret_storing/base_spec.rb +60 -0
  79. data/spec/lib/secret_storing/bcrypt_spec.rb +49 -0
  80. data/spec/lib/secret_storing/plain_spec.rb +44 -0
  81. data/spec/lib/secret_storing/sha256_hash_spec.rb +48 -0
  82. data/spec/models/doorkeeper/access_grant_spec.rb +61 -0
  83. data/spec/models/doorkeeper/access_token_spec.rb +123 -0
  84. data/spec/models/doorkeeper/application_spec.rb +56 -0
  85. data/spec/requests/flows/authorization_code_spec.rb +41 -1
  86. data/spec/requests/flows/client_credentials_spec.rb +2 -2
  87. data/spec/requests/flows/implicit_grant_spec.rb +1 -1
  88. data/spec/requests/flows/password_spec.rb +7 -5
  89. data/spec/requests/flows/revoke_token_spec.rb +14 -30
  90. data/spec/routing/custom_controller_routes_spec.rb +4 -0
  91. data/spec/spec_helper.rb +2 -1
  92. data/spec/support/ruby_2_6_rails_4_2_patch.rb +14 -0
  93. data/spec/support/shared/hashing_shared_context.rb +36 -0
  94. metadata +59 -22
@@ -26,30 +26,28 @@ describe 'Revoke Token Flow' do
26
26
  it 'should revoke the access token provided' do
27
27
  post revocation_token_endpoint_url, params: { token: access_token.token }, headers: headers
28
28
 
29
- access_token.reload
30
-
31
29
  expect(response).to be_successful
32
- expect(access_token.revoked?).to be_truthy
30
+ expect(access_token.reload.revoked?).to be_truthy
33
31
  end
34
32
 
35
33
  it 'should revoke the refresh token provided' do
36
34
  post revocation_token_endpoint_url, params: { token: access_token.refresh_token }, headers: headers
37
35
 
38
- access_token.reload
39
-
40
36
  expect(response).to be_successful
41
- expect(access_token.revoked?).to be_truthy
37
+ expect(access_token.reload.revoked?).to be_truthy
42
38
  end
43
39
 
44
40
  context 'with invalid token to revoke' do
45
41
  it 'should not revoke any tokens and respond successfully' do
46
- num_prev_revoked_tokens = Doorkeeper::AccessToken.where(revoked_at: nil).count
47
- post revocation_token_endpoint_url, params: { token: 'I_AM_AN_INVALID_TOKEN' }, headers: headers
42
+ expect do
43
+ post revocation_token_endpoint_url,
44
+ params: { token: 'I_AM_AN_INVALID_TOKEN' },
45
+ headers: headers
46
+ end.not_to(change { Doorkeeper::AccessToken.where(revoked_at: nil).count })
48
47
 
49
48
  # The authorization server responds with HTTP status code 200 even if
50
49
  # token is invalid
51
50
  expect(response).to be_successful
52
- expect(Doorkeeper::AccessToken.where(revoked_at: nil).count).to eq(num_prev_revoked_tokens)
53
51
  end
54
52
  end
55
53
 
@@ -62,10 +60,8 @@ describe 'Revoke Token Flow' do
62
60
  it 'should not revoke any tokens and respond successfully' do
63
61
  post revocation_token_endpoint_url, params: { token: access_token.token }, headers: headers
64
62
 
65
- access_token.reload
66
-
67
63
  expect(response).to be_successful
68
- expect(access_token.revoked?).to be_falsey
64
+ expect(access_token.reload.revoked?).to be_falsey
69
65
  end
70
66
  end
71
67
 
@@ -73,10 +69,8 @@ describe 'Revoke Token Flow' do
73
69
  it 'should not revoke any tokens and respond successfully' do
74
70
  post revocation_token_endpoint_url, params: { token: access_token.token }
75
71
 
76
- access_token.reload
77
-
78
72
  expect(response).to be_successful
79
- expect(access_token.revoked?).to be_falsey
73
+ expect(access_token.reload.revoked?).to be_falsey
80
74
  end
81
75
  end
82
76
 
@@ -92,10 +86,8 @@ describe 'Revoke Token Flow' do
92
86
  it 'should not revoke the token as its unauthorized' do
93
87
  post revocation_token_endpoint_url, params: { token: access_token.token }, headers: headers
94
88
 
95
- access_token.reload
96
-
97
89
  expect(response).to be_successful
98
- expect(access_token.revoked?).to be_falsey
90
+ expect(access_token.reload.revoked?).to be_falsey
99
91
  end
100
92
  end
101
93
  end
@@ -111,19 +103,15 @@ describe 'Revoke Token Flow' do
111
103
  it 'should revoke the access token provided' do
112
104
  post revocation_token_endpoint_url, params: { token: access_token.token }
113
105
 
114
- access_token.reload
115
-
116
106
  expect(response).to be_successful
117
- expect(access_token.revoked?).to be_truthy
107
+ expect(access_token.reload.revoked?).to be_truthy
118
108
  end
119
109
 
120
110
  it 'should revoke the refresh token provided' do
121
111
  post revocation_token_endpoint_url, params: { token: access_token.refresh_token }
122
112
 
123
- access_token.reload
124
-
125
113
  expect(response).to be_successful
126
- expect(access_token.revoked?).to be_truthy
114
+ expect(access_token.reload.revoked?).to be_truthy
127
115
  end
128
116
 
129
117
  context 'with a valid token issued for a confidential client' do
@@ -137,19 +125,15 @@ describe 'Revoke Token Flow' do
137
125
  it 'should not revoke the access token provided' do
138
126
  post revocation_token_endpoint_url, params: { token: access_token.token }
139
127
 
140
- access_token.reload
141
-
142
128
  expect(response).to be_successful
143
- expect(access_token.revoked?).to be_falsey
129
+ expect(access_token.reload.revoked?).to be_falsey
144
130
  end
145
131
 
146
132
  it 'should not revoke the refresh token provided' do
147
133
  post revocation_token_endpoint_url, params: { token: access_token.token }
148
134
 
149
- access_token.reload
150
-
151
135
  expect(response).to be_successful
152
- expect(access_token.revoked?).to be_falsey
136
+ expect(access_token.reload.revoked?).to be_falsey
153
137
  end
154
138
  end
155
139
  end
@@ -2,6 +2,10 @@ require 'spec_helper'
2
2
 
3
3
  describe 'Custom controller for routes' do
4
4
  before :all do
5
+ Doorkeeper.configure do
6
+ orm DOORKEEPER_ORM
7
+ end
8
+
5
9
  Rails.application.routes.disable_clear_and_finalize = true
6
10
 
7
11
  Rails.application.routes.draw do
data/spec/spec_helper.rb CHANGED
@@ -28,7 +28,8 @@ end
28
28
  Doorkeeper::RSpec.print_configuration_info
29
29
 
30
30
  # Remove after dropping support of Rails 4.2
31
- require "#{File.dirname(__FILE__)}/support/http_method_shim.rb"
31
+ require "#{File.dirname(__FILE__)}/support/http_method_shim"
32
+ require "#{File.dirname(__FILE__)}/support/ruby_2_6_rails_4_2_patch"
32
33
 
33
34
  require "support/orm/#{DOORKEEPER_ORM}"
34
35
 
@@ -0,0 +1,14 @@
1
+ if RUBY_VERSION >= '2.6.0'
2
+ if Rails::VERSION::MAJOR < 5
3
+ class ActionController::TestResponse < ActionDispatch::TestResponse
4
+ def recycle!
5
+ # hack to avoid MonitorMixin double-initialize error:
6
+ @mon_mutex_owner_object_id = nil
7
+ @mon_mutex = nil
8
+ initialize
9
+ end
10
+ end
11
+ else
12
+ puts "Monkeypatch for ActionController::TestResponse no longer needed"
13
+ end
14
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ shared_context 'with token hashing enabled' do
4
+ let(:hashed_or_plain_token_func) do
5
+ Doorkeeper::SecretStoring::Sha256Hash.method(:transform_secret)
6
+ end
7
+
8
+ before do
9
+ Doorkeeper.configure do
10
+ hash_token_secrets
11
+ end
12
+ end
13
+ end
14
+
15
+ shared_context 'with token hashing and fallback lookup enabled' do
16
+ let(:hashed_or_plain_token_func) do
17
+ Doorkeeper::SecretStoring::Sha256Hash.method(:transform_secret)
18
+ end
19
+
20
+ before do
21
+ Doorkeeper.configure do
22
+ hash_token_secrets fallback: :plain
23
+ end
24
+ end
25
+ end
26
+
27
+ shared_context 'with application hashing enabled' do
28
+ let(:hashed_or_plain_token_func) do
29
+ Doorkeeper::SecretStoring::Sha256Hash.method(:transform_secret)
30
+ end
31
+ before do
32
+ Doorkeeper.configure do
33
+ hash_application_secrets
34
+ end
35
+ end
36
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: doorkeeper
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.2
4
+ version: 5.1.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felipe Elias Philipp
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2018-10-25 00:00:00.000000000 Z
14
+ date: 2019-03-22 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: railties
@@ -28,21 +28,21 @@ dependencies:
28
28
  - !ruby/object:Gem::Version
29
29
  version: '4.2'
30
30
  - !ruby/object:Gem::Dependency
31
- name: capybara
31
+ name: appraisal
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  requirements:
34
- - - "~>"
34
+ - - ">="
35
35
  - !ruby/object:Gem::Version
36
- version: '2.18'
36
+ version: '0'
37
37
  type: :development
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - "~>"
41
+ - - ">="
42
42
  - !ruby/object:Gem::Version
43
- version: '2.18'
43
+ version: '0'
44
44
  - !ruby/object:Gem::Dependency
45
- name: coveralls
45
+ name: capybara
46
46
  requirement: !ruby/object:Gem::Requirement
47
47
  requirements:
48
48
  - - ">="
@@ -56,33 +56,33 @@ dependencies:
56
56
  - !ruby/object:Gem::Version
57
57
  version: '0'
58
58
  - !ruby/object:Gem::Dependency
59
- name: danger
59
+ name: coveralls
60
60
  requirement: !ruby/object:Gem::Requirement
61
61
  requirements:
62
- - - "~>"
62
+ - - ">="
63
63
  - !ruby/object:Gem::Version
64
- version: '5.0'
64
+ version: '0'
65
65
  type: :development
66
66
  prerelease: false
67
67
  version_requirements: !ruby/object:Gem::Requirement
68
68
  requirements:
69
- - - "~>"
69
+ - - ">="
70
70
  - !ruby/object:Gem::Version
71
- version: '5.0'
71
+ version: '0'
72
72
  - !ruby/object:Gem::Dependency
73
- name: grape
73
+ name: danger
74
74
  requirement: !ruby/object:Gem::Requirement
75
75
  requirements:
76
- - - ">="
76
+ - - "~>"
77
77
  - !ruby/object:Gem::Version
78
- version: '0'
78
+ version: '5.0'
79
79
  type: :development
80
80
  prerelease: false
81
81
  version_requirements: !ruby/object:Gem::Requirement
82
82
  requirements:
83
- - - ">="
83
+ - - "~>"
84
84
  - !ruby/object:Gem::Version
85
- version: '0'
85
+ version: '5.0'
86
86
  - !ruby/object:Gem::Dependency
87
87
  name: database_cleaner
88
88
  requirement: !ruby/object:Gem::Requirement
@@ -125,6 +125,20 @@ dependencies:
125
125
  - - "~>"
126
126
  - !ruby/object:Gem::Version
127
127
  version: 0.9.3
128
+ - !ruby/object:Gem::Dependency
129
+ name: grape
130
+ requirement: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ type: :development
136
+ prerelease: false
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
128
142
  - !ruby/object:Gem::Dependency
129
143
  name: rake
130
144
  requirement: !ruby/object:Gem::Requirement
@@ -205,12 +219,14 @@ files:
205
219
  - app/views/doorkeeper/authorized_applications/index.html.erb
206
220
  - app/views/layouts/doorkeeper/admin.html.erb
207
221
  - app/views/layouts/doorkeeper/application.html.erb
222
+ - bin/console
208
223
  - config/locales/en.yml
209
224
  - doorkeeper.gemspec
210
225
  - gemfiles/rails_4_2.gemfile
211
226
  - gemfiles/rails_5_0.gemfile
212
227
  - gemfiles/rails_5_1.gemfile
213
228
  - gemfiles/rails_5_2.gemfile
229
+ - gemfiles/rails_6_0.gemfile
214
230
  - gemfiles/rails_master.gemfile
215
231
  - lib/doorkeeper.rb
216
232
  - lib/doorkeeper/config.rb
@@ -226,8 +242,10 @@ files:
226
242
  - lib/doorkeeper/models/concerns/expirable.rb
227
243
  - lib/doorkeeper/models/concerns/orderable.rb
228
244
  - lib/doorkeeper/models/concerns/ownership.rb
245
+ - lib/doorkeeper/models/concerns/reusable.rb
229
246
  - lib/doorkeeper/models/concerns/revocable.rb
230
247
  - lib/doorkeeper/models/concerns/scopes.rb
248
+ - lib/doorkeeper/models/concerns/secret_storable.rb
231
249
  - lib/doorkeeper/oauth.rb
232
250
  - lib/doorkeeper/oauth/authorization/code.rb
233
251
  - lib/doorkeeper/oauth/authorization/context.rb
@@ -279,6 +297,10 @@ files:
279
297
  - lib/doorkeeper/request/refresh_token.rb
280
298
  - lib/doorkeeper/request/strategy.rb
281
299
  - lib/doorkeeper/request/token.rb
300
+ - lib/doorkeeper/secret_storing/base.rb
301
+ - lib/doorkeeper/secret_storing/bcrypt.rb
302
+ - lib/doorkeeper/secret_storing/plain.rb
303
+ - lib/doorkeeper/secret_storing/sha256_hash.rb
282
304
  - lib/doorkeeper/server.rb
283
305
  - lib/doorkeeper/stale_records_cleaner.rb
284
306
  - lib/doorkeeper/validations.rb
@@ -358,8 +380,10 @@ files:
358
380
  - spec/lib/config_spec.rb
359
381
  - spec/lib/doorkeeper_spec.rb
360
382
  - spec/lib/models/expirable_spec.rb
383
+ - spec/lib/models/reusable_spec.rb
361
384
  - spec/lib/models/revocable_spec.rb
362
385
  - spec/lib/models/scopes_spec.rb
386
+ - spec/lib/models/secret_storable_spec.rb
363
387
  - spec/lib/oauth/authorization/uri_builder_spec.rb
364
388
  - spec/lib/oauth/authorization_code_request_spec.rb
365
389
  - spec/lib/oauth/base_request_spec.rb
@@ -388,6 +412,10 @@ files:
388
412
  - spec/lib/oauth/token_response_spec.rb
389
413
  - spec/lib/oauth/token_spec.rb
390
414
  - spec/lib/request/strategy_spec.rb
415
+ - spec/lib/secret_storing/base_spec.rb
416
+ - spec/lib/secret_storing/bcrypt_spec.rb
417
+ - spec/lib/secret_storing/plain_spec.rb
418
+ - spec/lib/secret_storing/sha256_hash_spec.rb
391
419
  - spec/lib/server_spec.rb
392
420
  - spec/lib/stale_records_cleaner_spec.rb
393
421
  - spec/models/doorkeeper/access_grant_spec.rb
@@ -423,7 +451,9 @@ files:
423
451
  - spec/support/helpers/url_helper.rb
424
452
  - spec/support/http_method_shim.rb
425
453
  - spec/support/orm/active_record.rb
454
+ - spec/support/ruby_2_6_rails_4_2_patch.rb
426
455
  - spec/support/shared/controllers_shared_context.rb
456
+ - spec/support/shared/hashing_shared_context.rb
427
457
  - spec/support/shared/models_shared_examples.rb
428
458
  - spec/validators/redirect_uri_validator_spec.rb
429
459
  - spec/version/version_spec.rb
@@ -443,12 +473,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
443
473
  version: '2.1'
444
474
  required_rubygems_version: !ruby/object:Gem::Requirement
445
475
  requirements:
446
- - - ">="
476
+ - - ">"
447
477
  - !ruby/object:Gem::Version
448
- version: '0'
478
+ version: 1.3.1
449
479
  requirements: []
450
- rubyforge_project:
451
- rubygems_version: 2.6.11
480
+ rubygems_version: 3.0.2
452
481
  signing_key:
453
482
  specification_version: 4
454
483
  summary: OAuth 2 provider for Rails and Grape
@@ -514,8 +543,10 @@ test_files:
514
543
  - spec/lib/config_spec.rb
515
544
  - spec/lib/doorkeeper_spec.rb
516
545
  - spec/lib/models/expirable_spec.rb
546
+ - spec/lib/models/reusable_spec.rb
517
547
  - spec/lib/models/revocable_spec.rb
518
548
  - spec/lib/models/scopes_spec.rb
549
+ - spec/lib/models/secret_storable_spec.rb
519
550
  - spec/lib/oauth/authorization/uri_builder_spec.rb
520
551
  - spec/lib/oauth/authorization_code_request_spec.rb
521
552
  - spec/lib/oauth/base_request_spec.rb
@@ -544,6 +575,10 @@ test_files:
544
575
  - spec/lib/oauth/token_response_spec.rb
545
576
  - spec/lib/oauth/token_spec.rb
546
577
  - spec/lib/request/strategy_spec.rb
578
+ - spec/lib/secret_storing/base_spec.rb
579
+ - spec/lib/secret_storing/bcrypt_spec.rb
580
+ - spec/lib/secret_storing/plain_spec.rb
581
+ - spec/lib/secret_storing/sha256_hash_spec.rb
547
582
  - spec/lib/server_spec.rb
548
583
  - spec/lib/stale_records_cleaner_spec.rb
549
584
  - spec/models/doorkeeper/access_grant_spec.rb
@@ -579,7 +614,9 @@ test_files:
579
614
  - spec/support/helpers/url_helper.rb
580
615
  - spec/support/http_method_shim.rb
581
616
  - spec/support/orm/active_record.rb
617
+ - spec/support/ruby_2_6_rails_4_2_patch.rb
582
618
  - spec/support/shared/controllers_shared_context.rb
619
+ - spec/support/shared/hashing_shared_context.rb
583
620
  - spec/support/shared/models_shared_examples.rb
584
621
  - spec/validators/redirect_uri_validator_spec.rb
585
622
  - spec/version/version_spec.rb