gle 1.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7a59e3dfbe071b099b9d543b9fea4c6a5bccbde1b285dc451c2fa011b4e4c07a
4
+ data.tar.gz: e6ace1b16d3f4ed687b8947c782d4bc46b4fcdc009345b39a76edfa78dd86d35
5
+ SHA512:
6
+ metadata.gz: 40d36942ad6a9896a5b6ae0f7399fa9459843860dd210ab9d4c9fa1cfd18f879774fa48612c03d0fe4532da56c568cd34b95dbe3c294a9d090c2fab88c511200
7
+ data.tar.gz: d598f16213f60e12d98b81e3d5c65e8b4c2fa7c876d1a4164e4817611f7900fa36a70865c47ec5e4373cbb5396518a21a4f9364e9263cb29a50763ad13c18559
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ sudo: false
2
+ language: ruby
3
+ notifications:
4
+ email: false
5
+ rvm:
6
+ - 2.3.1
7
+ script:
8
+ - bundle exec rspec
9
+ - bundle exec yard stats | grep "100.00% documented"
data/CHANGELOG.md ADDED
@@ -0,0 +1,70 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ For more information about changelogs, check
6
+ [Keep a Changelog](http://keepachangelog.com) and
7
+ [Vandamme](http://tech-angels.github.io/vandamme).
8
+
9
+ ## 1.2.0 - 2026-05-24
10
+
11
+ * Renamed to Gle
12
+
13
+ ## 1.1.0 - 2024-12-10
14
+
15
+ * [FEATURE] Support mocking
16
+
17
+ - Use `Yt.configuration.mock_auth_error` to mock an error response
18
+ - Use `Yt.configuration.mock_auth_email` to mock authenticating as an email
19
+ - If the value of `mock_auth_email` is `invalid-email`, raise a Yt::HTTPError
20
+
21
+ ## 1.0.0 - 2024-11-26
22
+
23
+ Released major version. No breaking changes.
24
+
25
+ ## 0.3.1 - 2017-08-26
26
+
27
+ * [ENHANCEMENT] Add placeholder method to be notified when token is refreshed.
28
+
29
+ ## 0.3.0 - 2017-08-25
30
+
31
+ **How to upgrade**
32
+
33
+ If your code uses `Gle#url` then you must use `Gle.url_for` instead.
34
+ If your code uses `Gle.new(code:)` then you must use `Gle.create(code:)` instead.
35
+ If your code uses `Gle.new(refresh_token:)` then you must use `Gle.find_by(refresh_token:)` instead.
36
+
37
+ * [ENHANCEMENT] Extract `Auth#url` into `Auth.url_for`
38
+ * [ENHANCEMENT] Rename `Auth.new(code:)` into `Auth.create(code:)`
39
+ * [ENHANCEMENT] Rename `Auth.new(refresh_token:)` into `Auth.find_by(refresh_token:)`
40
+ * [FEATURE] Gle.url_for now accepts the scope to authenticate
41
+ * [FEATURE] Gle.url_for now accepts an option to force re-authentication
42
+ * [FEATURE] Add `Auth#revoke` to revoke a refresh token
43
+
44
+ ## 0.2.3 - 2017-08-24
45
+
46
+ * [FEATURE] Add the ability to generate access token from a refresh token
47
+
48
+ ## 0.2.2 - 2017-05-31
49
+
50
+ * [FEATURE] Add `Auth#access_token`
51
+
52
+ ## 0.2.1 - 2017-03-29
53
+
54
+ * [ENHANCEMENT] Speed up process by fetching email with 1 HTTP request (not 2).
55
+
56
+ ## 0.2.0 - 2017-03-29
57
+
58
+ **How to upgrade**
59
+
60
+ If your code uses `GleError` then you must use `Yt::HTTPError` instead.
61
+ If your code uses `GleRequest` then you must use `Yt::HTTPRequest` instead.
62
+
63
+ * [ENHANCEMENT] Extract `AuthError` to `HTTPError` in yt-support gem
64
+ * [ENHANCEMENT] Extract `AuthRequest` to `HTTPRequest` in yt-support gem
65
+
66
+ ## 0.1.0 - 2017-03-27
67
+
68
+ * [FEATURE] Add `AuthError`
69
+ * [FEATURE] Add `email`
70
+ * [FEATURE] Add `url`
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in gle.gemspec
4
+ gemspec
5
+
6
+ gem 'debug' # to invoke 'debugger'
7
+ gem 'irb'
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 Fullscreen, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,123 @@
1
+ Authenticate users with their Google account
2
+ ============================================
3
+
4
+ Gle lets you easily authenticate users of your website by means of
5
+ their Google-based email address.
6
+
7
+ With Gle, it is easy to limit access to your app to a few users without
8
+ the need for them to create a username and password.
9
+
10
+ The **source code** is available on [GitHub](https://github.com/claudiob/gle) and the **documentation** on [RubyDoc](http://www.rubydoc.info/gems/gle/frames).
11
+
12
+ [![Build Status](http://img.shields.io/travis/claudiob/gle/master.svg)](https://travis-ci.org/claudiob/gle)
13
+ [![Coverage Status](http://img.shields.io/coveralls/claudiob/gle/master.svg)](https://coveralls.io/r/claudiob/gle)
14
+ [![Dependency Status](http://img.shields.io/gemnasium/claudiob/gle.svg)](https://gemnasium.com/claudiob/gle)
15
+ [![Code Climate](http://img.shields.io/codeclimate/github/claudiob/gle.svg)](https://codeclimate.com/github/claudiob/gle)
16
+ [![Online docs](http://img.shields.io/badge/docs-✓-green.svg)](http://www.rubydoc.info/gems/gle/frames)
17
+ [![Gem Version](http://img.shields.io/gem/v/gle.svg)](http://rubygems.org/gems/gle)
18
+
19
+ Gle.url_for
20
+ ----------------
21
+
22
+ With the `url_for` class method, you can obtain a URL where to redirect users
23
+ who need to authenticate with their Google account in order to use your
24
+ application:
25
+
26
+ ```ruby
27
+ redirect_uri = 'https://example.com/auth' # REPLACE WITH REAL ONE
28
+ scope = %i(yt-analytics.readonly youtube)
29
+ Gle.url_for(redirect_uri: redirect_uri, scope: scope, force: true)
30
+ # => https://accounts.google.com/o/oauth2/auth?client_id=...&scope=email&redirect_uri=https%3A%2F%2Fexample.com%2Fauth&response_type=code
31
+ ```
32
+
33
+ Gle.create
34
+ ----------------
35
+
36
+ After users have authenticated with their Google account, they will be
37
+ redirected to the `redirect_uri` you indicated, with an extra `code` query
38
+ parameter, e.g. `https://example.com/auth?code=1234`
39
+
40
+ With the `create` class method, you can create an instance for that
41
+ authentication:
42
+
43
+ ```ruby
44
+ redirect_uri = 'https://example.com/auth' # REPLACE WITH REAL ONE
45
+ code = 'dfwe7r9djd234ffdjf3009dfknfd98re' # REPLACE WITH REAL ONE
46
+ auth = Gle.create(redirect_uri: redirect_uri, code: code)
47
+ # => #<Gle:0x007fe61d…>
48
+ ```
49
+
50
+ Gle#email
51
+ --------------
52
+
53
+ Once you have an instance of `Gle`, you can obtain the verified email
54
+ of the authenticated user:
55
+
56
+ ```ruby
57
+ auth.email
58
+ # => "user@example.com"
59
+ ```
60
+
61
+ Gle#access_token
62
+ ---------------------
63
+
64
+ Once you have an instance of `Gle`, you can also obtain the access token
65
+ of the authenticated user:
66
+
67
+ ```ruby
68
+ auth.access_token
69
+ # => "ya29.df8er8e9r89er"
70
+ ```
71
+
72
+ Gle#refresh_token
73
+ ----------------------
74
+
75
+ Once you have an instance of `Gle`, you can also obtain the refresh token
76
+ of the authenticated user:
77
+
78
+ ```ruby
79
+ auth.refresh_token
80
+ # => "sdf7f7erre98df"
81
+ ```
82
+
83
+ Gle.find_by
84
+ ----------------
85
+
86
+ If you already know the refresh token of a Google account, you can obtain its
87
+ complete authentication object:
88
+
89
+ ```ruby
90
+ auth = Gle.find_by(refresh_token: "sdf7f7erre98df")
91
+ auth.email
92
+ # => "user@example.com"
93
+ ```
94
+
95
+
96
+ Yt::HTTPError
97
+ -------------
98
+
99
+ `Yt::HTTPError` will be raised whenever something goes wrong during the
100
+ authentication process. The message of the error will include the details:
101
+
102
+ ```ruby
103
+ redirect_uri = 'https://example.com/auth' # REPLACE WITH REAL ONE
104
+ code = 'this-is-not-a-valid-code'
105
+ Gle.new(redirect_uri: redirect_uri, code: code).email
106
+ # => Yt::HTTPError: Invalid authorization code.
107
+ ```
108
+
109
+ How to contribute
110
+ =================
111
+
112
+ Contribute to the code by forking the project, adding the missing code,
113
+ writing the appropriate tests and submitting a pull request.
114
+
115
+ To run the tests correctly, set up the environment variables `YT_ACCOUNT_CLIENT_ID`
116
+ and `YT_ACCOUNT_CLIENT_SECRET` with the credentials of an existing Google OAuth app.
117
+
118
+ In order for a PR to be approved, all the tests need to pass and all the public
119
+ methods need to be documented and listed in the guides. Remember:
120
+
121
+ - to run all tests locally: `bundle exec rspec`
122
+ - to generate the docs locally: `bundle exec yard`
123
+ - to list undocumented methods: `bundle exec yard stats --list-undoc`
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rspec/core/rake_task'
4
+ require 'rspec/core/version'
5
+
6
+ desc 'Run all examples'
7
+ RSpec::Core::RakeTask.new :spec
8
+
9
+ task default: [:spec]
data/bin/console ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'gle'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ require 'irb'
10
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/gle.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'gle'
7
+ spec.version = '1.1.0'
8
+ spec.authors = ['claudiob']
9
+ spec.email = ['claudiob@users.noreply.github.com']
10
+
11
+ spec.summary = %q{Google Authentication Ruby client}
12
+ spec.description = %q{Gle makes it easy to authenticate users to any
13
+ web application by means of their Google account.}
14
+ spec.homepage = 'https://github.com/claudiob/gle'
15
+ spec.license = 'MIT'
16
+
17
+ spec.required_ruby_version = '>= 2.2.2'
18
+
19
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
20
+ f.match(%r{^(test|spec|features)/})
21
+ end
22
+ spec.bindir = 'exe'
23
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
+ spec.require_paths = ['lib']
25
+
26
+ spec.add_dependency 'yt-support'
27
+ spec.add_dependency 'jwt'
28
+
29
+ spec.add_development_dependency 'bundler'
30
+ spec.add_development_dependency 'rspec'
31
+ spec.add_development_dependency 'rake'
32
+ spec.add_development_dependency 'coveralls'
33
+ spec.add_development_dependency 'yard'
34
+ end
data/lib/gle.rb ADDED
@@ -0,0 +1,143 @@
1
+ require 'jwt'
2
+ require 'yt/config'
3
+ require 'yt/http_request'
4
+
5
+ # Provides methods to authenticate a user with the Google OAuth flow.
6
+ # @see https://developers.google.com/accounts/docs/OAuth2
7
+ class Gle
8
+ # @param [Hash] options the options to initialize an instance of Gle.
9
+ # @option options [String] :redirect_uri The URI to redirect users to
10
+ # after they have completed the Google OAuth flow.
11
+ # @option options [String] :code A single-use authorization code provided
12
+ # by Google OAuth to obtain an access token to access Google API.
13
+ def self.create(options = {})
14
+ new options.merge(grant_type: :authorization_code)
15
+ end
16
+
17
+ # @param [Hash] options the options to initialize an instance of Gle.
18
+ # @option options [String] :refresh_token A multi-use refresh token to
19
+ # obtain an access token to access Google API.
20
+ def self.find_by(options = {})
21
+ new options.merge(grant_type: :refresh_token)
22
+ end
23
+
24
+ # @return [String] the URL where to authenticate with a Google account.
25
+ # @param [Hash] options the options to initialize an instance of Gle.
26
+ # @option options [String] :redirect_uri The URI to redirect users to
27
+ # after they have completed the Google OAuth flow.
28
+ # @option options [Boolean] :force whether to force users to re-authenticate
29
+ # an account that was previously authenticated.
30
+ # @option options [Array<String>] :scopes The list of scopes that users
31
+ # are requested to authorize.
32
+ def self.url_for(options = {})
33
+ if Yt.configuration.mock_auth_error
34
+ options[:redirect_uri] + '?error=' + Yt.configuration.mock_auth_error
35
+ elsif Yt.configuration.mock_auth_email
36
+ options[:redirect_uri] + '?code=mock-email'
37
+ else
38
+ host = 'accounts.google.com'
39
+ path = '/o/oauth2/auth'
40
+ query = URI.encode_www_form url_params(options)
41
+ URI::HTTPS.build(host: host, path: path, query: query).to_s
42
+ end
43
+ end
44
+
45
+ # @param [Hash] options the options to initialize an instance of Gle.
46
+ # @option options [String] :grant_type
47
+ # @option options [String] :redirect_uri
48
+ # @option options [String] :code
49
+ # @option options [String] :refresh_token
50
+ def initialize(options = {})
51
+ @tokens_body = options
52
+ @tokens_body[:client_id] = Yt.configuration.client_id
53
+ @tokens_body[:client_secret] = Yt.configuration.client_secret
54
+ end
55
+
56
+ # @return [Boolean] whether the authentication was revoked.
57
+ def revoke
58
+ !!Yt::HTTPRequest.new(revoke_params).run
59
+ end
60
+
61
+ # @return [String] the email of an authenticated Google account.
62
+ def email
63
+ if Yt.configuration.mock_auth_email
64
+ if Yt.configuration.mock_auth_email.eql? 'invalid-email'
65
+ raise Yt::HTTPError, 'Malformed auth code'
66
+ else
67
+ Yt.configuration.mock_auth_email
68
+ end
69
+ else
70
+ profile['email']
71
+ end
72
+ end
73
+
74
+ # @return [String] the access token of an authenticated Google account.
75
+ def access_token
76
+ tokens['access_token']
77
+ end
78
+
79
+ # @return [String] the refresh token of an authenticated Google account.
80
+ def refresh_token
81
+ tokens['refresh_token']
82
+ end
83
+
84
+ # Placeholder method that can be invoked after a refresh token is used
85
+ # to generate a new access token. Applications can override this method,
86
+ # for instance to store the new token in a database
87
+ def access_token_was_refreshed
88
+ end
89
+
90
+ private
91
+
92
+ def self.url_params(options)
93
+ {}.tap do |params|
94
+ params[:client_id] = Yt.configuration.client_id
95
+ params[:scope] = scope_for(options.fetch :scopes, [])
96
+ params[:access_type] = :offline
97
+ params[:approval_prompt] = options[:force] ? :force : :auto
98
+ params[:redirect_uri] = options[:redirect_uri]
99
+ params[:response_type] = :code
100
+ end
101
+ end
102
+
103
+ def self.scope_for(scopes)
104
+ ['userinfo.email'].concat(scopes).map do |scope|
105
+ "https://www.googleapis.com/auth/#{scope}"
106
+ end.join(' ')
107
+ end
108
+
109
+ # @return [Hash] the tokens of an authenticated Google account.
110
+ def tokens
111
+ @tokens ||= Yt::HTTPRequest.new(tokens_params).run.body
112
+ end
113
+
114
+ # @return [Hash] the profile of an authenticated Google account.
115
+ def profile
116
+ decoded_tokens = JWT.decode tokens['id_token'], nil, false
117
+ decoded_tokens[0]
118
+ end
119
+
120
+ def tokens_params
121
+ {}.tap do |params|
122
+ params[:host] = 'oauth2.googleapis.com'
123
+ params[:path] = '/token'
124
+ params[:method] = :post
125
+ params[:request_format] = :form
126
+ params[:body] = @tokens_body
127
+ params[:error_message] = ->(code) { error_message_for code }
128
+ end
129
+ end
130
+
131
+ def revoke_params
132
+ {}.tap do |params|
133
+ params[:host] = 'oauth2.googleapis.com'
134
+ params[:path] = '/revoke'
135
+ params[:params] = {token: refresh_token || access_token}
136
+ end
137
+ end
138
+
139
+ def error_message_for(code)
140
+ key = @tokens_body[:grant_type].to_s.tr '_', ' '
141
+ JSON(@tokens_body)['error_description'] || "Invalid #{key}."
142
+ end
143
+ end
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gle
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
5
+ platform: ruby
6
+ authors:
7
+ - claudiob
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: yt-support
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: jwt
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: bundler
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rspec
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rake
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: coveralls
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: yard
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: |-
111
+ Gle makes it easy to authenticate users to any
112
+ web application by means of their Google account.
113
+ email:
114
+ - claudiob@users.noreply.github.com
115
+ executables: []
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - ".gitignore"
120
+ - ".rspec"
121
+ - ".travis.yml"
122
+ - CHANGELOG.md
123
+ - Gemfile
124
+ - LICENSE.txt
125
+ - README.md
126
+ - Rakefile
127
+ - bin/console
128
+ - bin/setup
129
+ - gle.gemspec
130
+ - lib/gle.rb
131
+ homepage: https://github.com/claudiob/gle
132
+ licenses:
133
+ - MIT
134
+ metadata: {}
135
+ rdoc_options: []
136
+ require_paths:
137
+ - lib
138
+ required_ruby_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: 2.2.2
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ requirements: []
149
+ rubygems_version: 4.0.3
150
+ specification_version: 4
151
+ summary: Google Authentication Ruby client
152
+ test_files: []