grape_oauth2 0.1.1 → 0.2.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 +4 -4
- data/.gitignore +11 -11
- data/Gemfile +23 -23
- data/Rakefile +11 -11
- data/grape_oauth2.gemspec +26 -27
- data/lib/grape_oauth2.rb +129 -129
- data/lib/grape_oauth2/configuration.rb +143 -143
- data/lib/grape_oauth2/configuration/class_accessors.rb +36 -36
- data/lib/grape_oauth2/configuration/validation.rb +71 -71
- data/lib/grape_oauth2/endpoints/authorize.rb +34 -34
- data/lib/grape_oauth2/endpoints/token.rb +72 -72
- data/lib/grape_oauth2/gem_version.rb +24 -24
- data/lib/grape_oauth2/generators/authorization.rb +44 -44
- data/lib/grape_oauth2/generators/base.rb +26 -26
- data/lib/grape_oauth2/generators/token.rb +62 -62
- data/lib/grape_oauth2/helpers/access_token_helpers.rb +52 -54
- data/lib/grape_oauth2/helpers/oauth_params.rb +41 -41
- data/lib/grape_oauth2/mixins/active_record/access_grant.rb +47 -47
- data/lib/grape_oauth2/mixins/active_record/access_token.rb +75 -75
- data/lib/grape_oauth2/mixins/active_record/client.rb +36 -35
- data/lib/grape_oauth2/mixins/mongoid/access_grant.rb +58 -58
- data/lib/grape_oauth2/mixins/mongoid/access_token.rb +88 -88
- data/lib/grape_oauth2/mixins/mongoid/client.rb +44 -41
- data/lib/grape_oauth2/mixins/sequel/access_grant.rb +68 -68
- data/lib/grape_oauth2/mixins/sequel/access_token.rb +86 -86
- data/lib/grape_oauth2/mixins/sequel/client.rb +54 -46
- data/lib/grape_oauth2/responses/authorization.rb +11 -10
- data/lib/grape_oauth2/responses/base.rb +56 -56
- data/lib/grape_oauth2/responses/token.rb +10 -10
- data/lib/grape_oauth2/scopes.rb +74 -74
- data/lib/grape_oauth2/strategies/authorization_code.rb +38 -38
- data/lib/grape_oauth2/strategies/base.rb +47 -47
- data/lib/grape_oauth2/strategies/client_credentials.rb +20 -20
- data/lib/grape_oauth2/strategies/password.rb +22 -22
- data/lib/grape_oauth2/strategies/refresh_token.rb +47 -47
- data/lib/grape_oauth2/unique_token.rb +20 -20
- data/lib/grape_oauth2/version.rb +14 -14
- data/spec/configuration/config_spec.rb +231 -231
- data/spec/configuration/version_spec.rb +12 -12
- data/spec/dummy/endpoints/custom_authorization.rb +25 -25
- data/spec/dummy/endpoints/custom_token.rb +35 -35
- data/spec/dummy/endpoints/status.rb +25 -25
- data/spec/dummy/grape_oauth2_config.rb +11 -11
- data/spec/dummy/orm/active_record/app/config/db.rb +7 -7
- data/spec/dummy/orm/active_record/app/models/access_code.rb +3 -3
- data/spec/dummy/orm/active_record/app/models/access_token.rb +3 -3
- data/spec/dummy/orm/active_record/app/models/application.rb +3 -3
- data/spec/dummy/orm/active_record/app/models/application_record.rb +3 -3
- data/spec/dummy/orm/active_record/app/models/user.rb +10 -10
- data/spec/dummy/orm/active_record/app/twitter.rb +36 -36
- data/spec/dummy/orm/active_record/config.ru +7 -7
- data/spec/dummy/orm/active_record/db/schema.rb +53 -53
- data/spec/dummy/orm/mongoid/app/config/db.rb +6 -6
- data/spec/dummy/orm/mongoid/app/config/mongoid.yml +21 -21
- data/spec/dummy/orm/mongoid/app/models/access_code.rb +3 -3
- data/spec/dummy/orm/mongoid/app/models/access_token.rb +3 -3
- data/spec/dummy/orm/mongoid/app/models/application.rb +3 -3
- data/spec/dummy/orm/mongoid/app/models/user.rb +11 -11
- data/spec/dummy/orm/mongoid/app/twitter.rb +34 -34
- data/spec/dummy/orm/mongoid/config.ru +5 -5
- data/spec/dummy/orm/sequel/app/config/db.rb +1 -1
- data/spec/dummy/orm/sequel/app/models/access_code.rb +4 -4
- data/spec/dummy/orm/sequel/app/models/access_token.rb +4 -4
- data/spec/dummy/orm/sequel/app/models/application.rb +4 -4
- data/spec/dummy/orm/sequel/app/models/application_record.rb +2 -2
- data/spec/dummy/orm/sequel/app/models/user.rb +11 -11
- data/spec/dummy/orm/sequel/app/twitter.rb +47 -47
- data/spec/dummy/orm/sequel/config.ru +5 -5
- data/spec/dummy/orm/sequel/db/schema.rb +50 -50
- data/spec/lib/scopes_spec.rb +50 -50
- data/spec/mixins/active_record/access_token_spec.rb +185 -185
- data/spec/mixins/active_record/client_spec.rb +104 -95
- data/spec/mixins/mongoid/access_token_spec.rb +185 -185
- data/spec/mixins/mongoid/client_spec.rb +104 -95
- data/spec/mixins/sequel/access_token_spec.rb +185 -185
- data/spec/mixins/sequel/client_spec.rb +105 -96
- data/spec/requests/flows/authorization_code_spec.rb +67 -67
- data/spec/requests/flows/client_credentials_spec.rb +101 -101
- data/spec/requests/flows/password_spec.rb +210 -210
- data/spec/requests/flows/refresh_token_spec.rb +222 -222
- data/spec/requests/flows/revoke_token_spec.rb +103 -103
- data/spec/requests/protected_resources_spec.rb +64 -64
- data/spec/spec_helper.rb +60 -60
- data/spec/support/api_helper.rb +11 -11
- metadata +50 -52
- data/.rspec +0 -2
- data/.rubocop.yml +0 -18
- data/.travis.yml +0 -42
- data/README.md +0 -820
- data/gemfiles/active_record.rb +0 -25
- data/gemfiles/mongoid.rb +0 -14
- data/gemfiles/sequel.rb +0 -24
- data/grape_oauth2.png +0 -0
@@ -1,36 +1,36 @@
|
|
1
|
-
module Grape
|
2
|
-
module OAuth2
|
3
|
-
# Grape::OAuth2 accessors for configured classes.
|
4
|
-
module ClassAccessors
|
5
|
-
# Returns Access Token class by configured name
|
6
|
-
def access_token_class
|
7
|
-
@_access_token_class ||= access_token_class_name.constantize
|
8
|
-
end
|
9
|
-
|
10
|
-
# Returns Resource Owner class by configured name
|
11
|
-
def resource_owner_class
|
12
|
-
@_resource_owner_class ||= resource_owner_class_name.constantize
|
13
|
-
end
|
14
|
-
|
15
|
-
# Returns Client class by configured name
|
16
|
-
def client_class
|
17
|
-
@_client_class ||= client_class_name.constantize
|
18
|
-
end
|
19
|
-
|
20
|
-
# Returns Access Grant class by configured name
|
21
|
-
def access_grant_class
|
22
|
-
@_access_grant_class ||= access_grant_class_name.constantize
|
23
|
-
end
|
24
|
-
|
25
|
-
# Returns Scopes Validator class by configured name
|
26
|
-
def scopes_validator
|
27
|
-
scopes_validator_class_name.constantize
|
28
|
-
end
|
29
|
-
|
30
|
-
# Returns Token Generator class by configured name
|
31
|
-
def token_generator
|
32
|
-
token_generator_class_name.constantize
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
1
|
+
module Grape
|
2
|
+
module OAuth2
|
3
|
+
# Grape::OAuth2 accessors for configured classes.
|
4
|
+
module ClassAccessors
|
5
|
+
# Returns Access Token class by configured name
|
6
|
+
def access_token_class
|
7
|
+
@_access_token_class ||= access_token_class_name.constantize
|
8
|
+
end
|
9
|
+
|
10
|
+
# Returns Resource Owner class by configured name
|
11
|
+
def resource_owner_class
|
12
|
+
@_resource_owner_class ||= resource_owner_class_name.constantize
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns Client class by configured name
|
16
|
+
def client_class
|
17
|
+
@_client_class ||= client_class_name.constantize
|
18
|
+
end
|
19
|
+
|
20
|
+
# Returns Access Grant class by configured name
|
21
|
+
def access_grant_class
|
22
|
+
@_access_grant_class ||= access_grant_class_name.constantize
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns Scopes Validator class by configured name
|
26
|
+
def scopes_validator
|
27
|
+
scopes_validator_class_name.constantize
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns Token Generator class by configured name
|
31
|
+
def token_generator
|
32
|
+
token_generator_class_name.constantize
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -1,71 +1,71 @@
|
|
1
|
-
module Grape
|
2
|
-
module OAuth2
|
3
|
-
class Configuration
|
4
|
-
# Validates Grape::OAuth2 configuration.
|
5
|
-
module Validation
|
6
|
-
# Checks configuration to be set correctly
|
7
|
-
# (required classes must be defined and implement specific set of API).
|
8
|
-
def check!
|
9
|
-
check_required_classes!
|
10
|
-
check_required_classes_api!
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
# API mapping.
|
16
|
-
# Classes, that represents OAuth2 roles, must have described methods.
|
17
|
-
REQUIRED_CLASSES_API = {
|
18
|
-
access_token_class: {
|
19
|
-
class_methods: %i
|
20
|
-
instance_methods: %i
|
21
|
-
},
|
22
|
-
client_class: {
|
23
|
-
class_methods: %i
|
24
|
-
},
|
25
|
-
token_generator: {
|
26
|
-
class_methods: %i
|
27
|
-
},
|
28
|
-
scopes_validator: {
|
29
|
-
instance_methods: %i
|
30
|
-
}
|
31
|
-
}.freeze
|
32
|
-
|
33
|
-
# Validates that required classes defined.
|
34
|
-
def check_required_classes!
|
35
|
-
REQUIRED_CLASSES_API.keys.each do |klass|
|
36
|
-
begin
|
37
|
-
object = send(klass)
|
38
|
-
rescue NoMethodError
|
39
|
-
raise Error, "'#{klass}' must be defined!" if object.nil? || !defined?(object)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# Validates that required classes have all the API.
|
45
|
-
def check_required_classes_api!
|
46
|
-
REQUIRED_CLASSES_API.each do |klass, api_methods|
|
47
|
-
check_class_methods(klass, api_methods[:class_methods])
|
48
|
-
check_instance_methods(klass, api_methods[:instance_methods])
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
# Validates that required classes have required class methods.
|
53
|
-
def check_class_methods(klass, required_methods)
|
54
|
-
(required_methods || []).each do |method|
|
55
|
-
method_exist = send(klass).respond_to?(method)
|
56
|
-
raise APIMissing, "Class method '#{method}' must be defined for the '#{klass}'!" unless method_exist
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
# Validates that required classes have required instance methods.
|
61
|
-
def check_instance_methods(klass, required_methods)
|
62
|
-
(required_methods || []).each do |method|
|
63
|
-
unless send(klass).method_defined?(method)
|
64
|
-
raise APIMissing, "Instance method '#{method}' must be defined for the '#{klass}'!"
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
1
|
+
module Grape
|
2
|
+
module OAuth2
|
3
|
+
class Configuration
|
4
|
+
# Validates Grape::OAuth2 configuration.
|
5
|
+
module Validation
|
6
|
+
# Checks configuration to be set correctly
|
7
|
+
# (required classes must be defined and implement specific set of API).
|
8
|
+
def check!
|
9
|
+
check_required_classes!
|
10
|
+
check_required_classes_api!
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
# API mapping.
|
16
|
+
# Classes, that represents OAuth2 roles, must have described methods.
|
17
|
+
REQUIRED_CLASSES_API = {
|
18
|
+
access_token_class: {
|
19
|
+
class_methods: %i[authenticate create_for],
|
20
|
+
instance_methods: %i[expired? revoked? revoke! to_bearer_token]
|
21
|
+
},
|
22
|
+
client_class: {
|
23
|
+
class_methods: %i[authenticate]
|
24
|
+
},
|
25
|
+
token_generator: {
|
26
|
+
class_methods: %i[generate]
|
27
|
+
},
|
28
|
+
scopes_validator: {
|
29
|
+
instance_methods: %i[valid_for?]
|
30
|
+
}
|
31
|
+
}.freeze
|
32
|
+
|
33
|
+
# Validates that required classes defined.
|
34
|
+
def check_required_classes!
|
35
|
+
REQUIRED_CLASSES_API.keys.each do |klass|
|
36
|
+
begin
|
37
|
+
object = send(klass)
|
38
|
+
rescue NoMethodError
|
39
|
+
raise Error, "'#{klass}' must be defined!" if object.nil? || !defined?(object)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Validates that required classes have all the API.
|
45
|
+
def check_required_classes_api!
|
46
|
+
REQUIRED_CLASSES_API.each do |klass, api_methods|
|
47
|
+
check_class_methods(klass, api_methods[:class_methods])
|
48
|
+
check_instance_methods(klass, api_methods[:instance_methods])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Validates that required classes have required class methods.
|
53
|
+
def check_class_methods(klass, required_methods)
|
54
|
+
(required_methods || []).each do |method|
|
55
|
+
method_exist = send(klass).respond_to?(method)
|
56
|
+
raise APIMissing, "Class method '#{method}' must be defined for the '#{klass}'!" unless method_exist
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Validates that required classes have required instance methods.
|
61
|
+
def check_instance_methods(klass, required_methods)
|
62
|
+
(required_methods || []).each do |method|
|
63
|
+
unless send(klass).method_defined?(method)
|
64
|
+
raise APIMissing, "Instance method '#{method}' must be defined for the '#{klass}'!"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -1,34 +1,34 @@
|
|
1
|
-
module Grape
|
2
|
-
module OAuth2
|
3
|
-
# Grape::OAuth2 endpoints namespace
|
4
|
-
module Endpoints
|
5
|
-
# OAuth2 Grape authorization endpoint.
|
6
|
-
class Authorize < ::Grape::API
|
7
|
-
helpers Grape::OAuth2::Helpers::OAuthParams
|
8
|
-
|
9
|
-
namespace :oauth do
|
10
|
-
desc 'OAuth 2.0 Authorization Endpoint'
|
11
|
-
|
12
|
-
params do
|
13
|
-
use :oauth_authorization_params
|
14
|
-
end
|
15
|
-
|
16
|
-
post :authorize do
|
17
|
-
response = Grape::OAuth2::Generators::Authorization.generate_for(env)
|
18
|
-
|
19
|
-
# Status
|
20
|
-
status response.status
|
21
|
-
|
22
|
-
# Headers
|
23
|
-
response.headers.each do |key, value|
|
24
|
-
header key, value
|
25
|
-
end
|
26
|
-
|
27
|
-
# Body
|
28
|
-
body response.body
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
1
|
+
module Grape
|
2
|
+
module OAuth2
|
3
|
+
# Grape::OAuth2 endpoints namespace
|
4
|
+
module Endpoints
|
5
|
+
# OAuth2 Grape authorization endpoint.
|
6
|
+
class Authorize < ::Grape::API
|
7
|
+
helpers Grape::OAuth2::Helpers::OAuthParams
|
8
|
+
|
9
|
+
namespace :oauth do
|
10
|
+
desc 'OAuth 2.0 Authorization Endpoint'
|
11
|
+
|
12
|
+
params do
|
13
|
+
use :oauth_authorization_params
|
14
|
+
end
|
15
|
+
|
16
|
+
post :authorize do
|
17
|
+
response = Grape::OAuth2::Generators::Authorization.generate_for(env)
|
18
|
+
|
19
|
+
# Status
|
20
|
+
status response.status
|
21
|
+
|
22
|
+
# Headers
|
23
|
+
response.headers.each do |key, value|
|
24
|
+
header key, value
|
25
|
+
end
|
26
|
+
|
27
|
+
# Body
|
28
|
+
body response.body
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,72 +1,72 @@
|
|
1
|
-
module Grape
|
2
|
-
module OAuth2
|
3
|
-
# Grape::OAuth2 endpoints namespace
|
4
|
-
module Endpoints
|
5
|
-
# OAuth2 Grape token endpoint.
|
6
|
-
class Token < ::Grape::API
|
7
|
-
helpers Grape::OAuth2::Helpers::OAuthParams
|
8
|
-
|
9
|
-
namespace :oauth do
|
10
|
-
# @see https://tools.ietf.org/html/rfc6749#section-3.2
|
11
|
-
#
|
12
|
-
desc 'OAuth 2.0 Token Endpoint'
|
13
|
-
|
14
|
-
params do
|
15
|
-
use :oauth_token_params
|
16
|
-
end
|
17
|
-
|
18
|
-
post :token do
|
19
|
-
token_response = Grape::OAuth2::Generators::Token.generate_for(env)
|
20
|
-
|
21
|
-
# Status
|
22
|
-
status token_response.status
|
23
|
-
|
24
|
-
# Headers
|
25
|
-
token_response.headers.each do |key, value|
|
26
|
-
header key, value
|
27
|
-
end
|
28
|
-
|
29
|
-
# Body
|
30
|
-
body token_response.body
|
31
|
-
end
|
32
|
-
|
33
|
-
desc 'OAuth 2.0 Token Revocation'
|
34
|
-
|
35
|
-
params do
|
36
|
-
use :oauth_token_revocation_params
|
37
|
-
end
|
38
|
-
|
39
|
-
post :revoke do
|
40
|
-
access_token = Grape::OAuth2.config.access_token_class.authenticate(params[:token],
|
41
|
-
type: params[:token_type_hint])
|
42
|
-
|
43
|
-
if access_token
|
44
|
-
if access_token.client
|
45
|
-
request = Rack::OAuth2::Server::Token::Request.new(env)
|
46
|
-
|
47
|
-
# The authorization server, if applicable, first authenticates the client
|
48
|
-
# and checks its ownership of the provided token.
|
49
|
-
client = Grape::OAuth2::Strategies::Base.authenticate_client(request)
|
50
|
-
request.invalid_client! if client.nil?
|
51
|
-
|
52
|
-
access_token.revoke! if client && client == access_token.client
|
53
|
-
else
|
54
|
-
# Access token is public
|
55
|
-
access_token.revoke!
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
# The authorization server responds with HTTP status code 200 if the token
|
60
|
-
# has been revoked successfully or if the client submitted an invalid
|
61
|
-
# token.
|
62
|
-
#
|
63
|
-
# @see https://tools.ietf.org/html/rfc7009#section-2.2 Revocation Response
|
64
|
-
#
|
65
|
-
status 200
|
66
|
-
{}
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
1
|
+
module Grape
|
2
|
+
module OAuth2
|
3
|
+
# Grape::OAuth2 endpoints namespace
|
4
|
+
module Endpoints
|
5
|
+
# OAuth2 Grape token endpoint.
|
6
|
+
class Token < ::Grape::API
|
7
|
+
helpers Grape::OAuth2::Helpers::OAuthParams
|
8
|
+
|
9
|
+
namespace :oauth do
|
10
|
+
# @see https://tools.ietf.org/html/rfc6749#section-3.2
|
11
|
+
#
|
12
|
+
desc 'OAuth 2.0 Token Endpoint'
|
13
|
+
|
14
|
+
params do
|
15
|
+
use :oauth_token_params
|
16
|
+
end
|
17
|
+
|
18
|
+
post :token do
|
19
|
+
token_response = Grape::OAuth2::Generators::Token.generate_for(env)
|
20
|
+
|
21
|
+
# Status
|
22
|
+
status token_response.status
|
23
|
+
|
24
|
+
# Headers
|
25
|
+
token_response.headers.each do |key, value|
|
26
|
+
header key, value
|
27
|
+
end
|
28
|
+
|
29
|
+
# Body
|
30
|
+
body token_response.body
|
31
|
+
end
|
32
|
+
|
33
|
+
desc 'OAuth 2.0 Token Revocation'
|
34
|
+
|
35
|
+
params do
|
36
|
+
use :oauth_token_revocation_params
|
37
|
+
end
|
38
|
+
|
39
|
+
post :revoke do
|
40
|
+
access_token = Grape::OAuth2.config.access_token_class.authenticate(params[:token],
|
41
|
+
type: params[:token_type_hint])
|
42
|
+
|
43
|
+
if access_token
|
44
|
+
if access_token.client
|
45
|
+
request = Rack::OAuth2::Server::Token::Request.new(env)
|
46
|
+
|
47
|
+
# The authorization server, if applicable, first authenticates the client
|
48
|
+
# and checks its ownership of the provided token.
|
49
|
+
client = Grape::OAuth2::Strategies::Base.authenticate_client(request)
|
50
|
+
request.invalid_client! if client.nil?
|
51
|
+
|
52
|
+
access_token.revoke! if client && client == access_token.client
|
53
|
+
else
|
54
|
+
# Access token is public
|
55
|
+
access_token.revoke!
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# The authorization server responds with HTTP status code 200 if the token
|
60
|
+
# has been revoked successfully or if the client submitted an invalid
|
61
|
+
# token.
|
62
|
+
#
|
63
|
+
# @see https://tools.ietf.org/html/rfc7009#section-2.2 Revocation Response
|
64
|
+
#
|
65
|
+
status 200
|
66
|
+
{}
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -1,24 +1,24 @@
|
|
1
|
-
module Grape
|
2
|
-
module OAuth2
|
3
|
-
# Grape::OAuth2 version.
|
4
|
-
# @return [Gem::Version] version of the gem
|
5
|
-
#
|
6
|
-
def self.gem_version
|
7
|
-
Gem::Version.new VERSION::STRING
|
8
|
-
end
|
9
|
-
|
10
|
-
# Grape::OAuth2 semantic versioning module.
|
11
|
-
# Contains detailed info about gem version.
|
12
|
-
module VERSION
|
13
|
-
# Major version of the gem
|
14
|
-
MAJOR = 0
|
15
|
-
# Minor version of the gem
|
16
|
-
MINOR =
|
17
|
-
# Tiny version of the gem
|
18
|
-
TINY =
|
19
|
-
|
20
|
-
# Full gem version string
|
21
|
-
STRING = [MAJOR, MINOR, TINY].compact.join('.')
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
1
|
+
module Grape
|
2
|
+
module OAuth2
|
3
|
+
# Grape::OAuth2 version.
|
4
|
+
# @return [Gem::Version] version of the gem
|
5
|
+
#
|
6
|
+
def self.gem_version
|
7
|
+
Gem::Version.new VERSION::STRING
|
8
|
+
end
|
9
|
+
|
10
|
+
# Grape::OAuth2 semantic versioning module.
|
11
|
+
# Contains detailed info about gem version.
|
12
|
+
module VERSION
|
13
|
+
# Major version of the gem
|
14
|
+
MAJOR = 0
|
15
|
+
# Minor version of the gem
|
16
|
+
MINOR = 2
|
17
|
+
# Tiny version of the gem
|
18
|
+
TINY = 0
|
19
|
+
|
20
|
+
# Full gem version string
|
21
|
+
STRING = [MAJOR, MINOR, TINY].compact.join('.')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|