omniauth-heroku 0.4.1 → 1.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
  SHA256:
3
- metadata.gz: 7114a261c4657b1093fa15c002dc0c5dc501c3a147670c99b31bb82bb2173290
4
- data.tar.gz: 409fe3bd640e82ec72fc30f92ef9a0fd383bb95260b4f1d8d7d9d070b6d325b4
3
+ metadata.gz: 5e748c5250cbb5edbba46f40b0f38d4a8cf54cd5c266b6df4deaebc57637e9d1
4
+ data.tar.gz: 4a5af940242e0cfb0a51ba7d73983303264846bb9278839cabadaaa890cf0227
5
5
  SHA512:
6
- metadata.gz: 36e9c08495d7941cf3a19b8e2b972ec2d70fd992c326f88586141892c5bc445ab4ee9ff28927062d6a5babd58351f7b16fda97fcea9e5933750bc73178f5d6fd
7
- data.tar.gz: 6d8bcd09cd0847c01f870ad2d955a90b21ac449b56ba0aafcd275790a9fc8efbca5aae86252a80f3ec916583780d352516b4065e275a9b9450c6201d034c4703
6
+ metadata.gz: a623e6356f151b83eb7e370f8039e51012c9a76adf17187fe279aff23c10744b03514c46195198fd6261b9bcc206639ab7a15ea48875f6c06b300e3d8c72e45c
7
+ data.tar.gz: 61a1c1b3114cbf737de9de020572c98db82d3c29a180e0b135f3188ec6938123dc29766685475eff28e833d4d58ae600435411392b0a84579396757edccf5e19
@@ -0,0 +1,29 @@
1
+ name: CI
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ test:
7
+ runs-on: ubuntu-latest
8
+
9
+ strategy:
10
+ fail-fast: false
11
+ matrix:
12
+ ruby: [ 2.3, 2.4, 2.5, 2.6, 2.7, 3.0 ]
13
+ gemfile: ["omniauth1", "omniauth2"]
14
+
15
+ env: # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps
16
+ BUNDLE_GEMFILE: Gemfile-${{ matrix.gemfile }}
17
+
18
+ steps:
19
+ - uses: actions/checkout@v2
20
+
21
+ - name: Setup Ruby
22
+ uses: ruby/setup-ruby@v1
23
+ with:
24
+ ruby-version: ${{ matrix.ruby }}
25
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
26
+
27
+ - name: Build and test
28
+ run: bin/rspec
29
+
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ # Ignore all logfiles and tempfiles
2
+ /coverage/
3
+ /log/
4
+ /spec/reports
5
+ /spec/rspec-status.txt
6
+ /tmp/
7
+ /tags
8
+
9
+ # Package and dependency caches
10
+ /.bundle
11
+ /Gemfile.lock
12
+ /pkg/
13
+
14
+ # Generated documentation
15
+ /doc/
16
+ /.yardoc
17
+ /_yardoc/
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --require spec_helper
2
+ --color
3
+ --format progress
data/CHANGELOG.md ADDED
@@ -0,0 +1,43 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
5
+ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [1.0.0] 2021-07-14
10
+
11
+ ### Changed
12
+
13
+ - Support `omniauth` versions `>= 1.9` but `< 3`.
14
+ i.e., support version `2` which addresses some CVEs.
15
+ - Standardize syntax and style via [Standard.rb](https://github.com/testdouble/standard)
16
+
17
+ ### Breaking
18
+
19
+ - Loosen `omniauth-oauth2` requirement to allow `>= 1.7.0`.
20
+ With this change, blocks give to dynamically determine the `:scope` argument will be passed the Rack `env`, rather than an instance of the `Rack::Request`.
21
+ See the [Upgrading to 1.0 docs](README.md#upgrading-to-10) for more.
22
+ - Remove `AuthUrl` and `ApiUrl` constants from `OmniAuth::Strategies::Heroku`.
23
+ These were internal details, not meant to be part of the public API.
24
+ - Require Ruby `>= 2.3.0`.
25
+ We were only supporting that anyway, but now it's explicit.
26
+ However, we do recommend only running on [actively supported Rubies](https://www.ruby-lang.org/en/downloads/branches/).
27
+
28
+ ## [0.4.1] 2021-07-06
29
+
30
+ ### Changed
31
+ - Lock to `omniauth-oauth2 ~> 1.6.0` to fix regression in dynamic `:scope` option.
32
+ With `omniauth-oauth2 >= 1.7.0`, the block is passed the Rack `env` as the parameter.
33
+ This breaks our expectation the will receive a `Rack::Request` instance as the argument to dynamically determine the `:scope` option.
34
+ i.e., this broken:
35
+
36
+ ```ruby
37
+ use OmniAuth::Builder do
38
+ provider :heroku, ENV.fetch("HEROKU_OAUTH_ID"), ENV.fetch("HEROKU_OAUTH_SECRET"),
39
+ scope: ->(request) { request.params["scope"] || "identity" }
40
+ end
41
+ ```
42
+
43
+ See [PR #22](https://github.com/heroku/omniauth-heroku/pull/22) for more context, workaround, etc...
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://www.rubygems.org"
2
+
3
+ gemspec
data/Gemfile-omniauth1 ADDED
@@ -0,0 +1,5 @@
1
+ source "https://www.rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem "omniauth", "~> 1.9"
data/Gemfile-omniauth2 ADDED
@@ -0,0 +1,5 @@
1
+ source "https://www.rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem "omniauth", "~> 2.0"
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # OmniAuth Heroku
2
2
 
3
3
  [![Build Status](https://github.com/heroku/omniauth-heroku/actions/workflows/ci.yml/badge.svg)](https://github.com/heroku/omniauth-heroku/actions)
4
+ [![Gem Version](https://badge.fury.io/rb/omniauth-heroku.svg)](https://badge.fury.io/rb/omniauth-heroku)
4
5
 
5
6
  [OmniAuth](https://github.com/intridea/omniauth) strategy for authenticating
6
7
  Heroku users.
@@ -89,20 +90,41 @@ use OmniAuth::Builder do
89
90
  end
90
91
  ```
91
92
 
92
- This will trim down the permissions associated to the access token given back
93
- to you.
93
+ This will trim down the permissions associated to the access token given back to you.
94
94
 
95
- The Oauth scope can also be decided dynamically at runtime. For example, you
96
- could use a `scope` GET parameter if it exists, and revert to a default `scope`
97
- if it does not:
95
+ The OAuth scope can also be decided dynamically at runtime.
96
+ For example, you could use a `scope` parameter from the request, if it exists, with a default value if it does not:
98
97
 
99
98
  ```ruby
100
99
  use OmniAuth::Builder do
101
100
  provider :heroku, ENV.fetch("HEROKU_OAUTH_ID"), ENV.fetch("HEROKU_OAUTH_SECRET"),
102
- scope: ->(request) { request.params["scope"] || "identity" }
101
+ scope: ->(env) { Rack::Request.new(env).params["scope"] || "identity" }
103
102
  end
104
103
  ```
105
104
 
105
+ #### Upgrading to 1.0+
106
+
107
+ Versions before `1.0` allowed you to pass `:scope` option as a block, just as today.
108
+ However, that block received a `Rack::Request` instance, rather than the `Rack` `env`.
109
+ If you used the `Rack::Request` argument in your `:scope` block you can update your code to create a new instance, from the `env`.
110
+
111
+ For example, `< 1.0` code that looked like this:
112
+
113
+ ```ruby
114
+ use OmniAuth::Builder do
115
+ provider :heroku, ENV.fetch("HEROKU_OAUTH_ID"), ENV.fetch("HEROKU_OAUTH_SECRET"),
116
+ scope: ->(request) { request.params["scope"] }
117
+ end
118
+ ```
119
+
120
+ need to be updated to something like this:
121
+
122
+ ```ruby
123
+ use OmniAuth::Builder do
124
+ provider :heroku, ENV.fetch("HEROKU_OAUTH_ID"), ENV.fetch("HEROKU_OAUTH_SECRET"),
125
+ scope: ->(env) { Rack::Request.new(env).params["scope"] }
126
+ end
127
+ ```
106
128
 
107
129
  ## Example - Sinatra
108
130
 
@@ -162,7 +184,7 @@ class SessionsController < ApplicationController
162
184
  end
163
185
 
164
186
  def create
165
- access_token = request.env['omniauth.auth']['credentials']['token']
187
+ access_token = request.env["omniauth.auth"]["credentials"]["token"]
166
188
  # DO NOT store this token in an unencrypted cookie session
167
189
  # Please read "A note on security" below!
168
190
  heroku = PlatformAPI.connect_oauth(access_token)
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require "rspec/core/rake_task"
4
+
5
+ task default: :spec
6
+
7
+ desc "Run the specs"
8
+ RSpec::Core::RakeTask.new do |t|
9
+ t.pattern = "spec/**/*_spec.rb"
10
+ end
data/bin/rake ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rake' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("rake", "rake")
data/bin/rspec ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rspec' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("rspec-core", "rspec")
@@ -1 +1,2 @@
1
- require 'omniauth/strategies/heroku'
1
+ require "omniauth/heroku/version"
2
+ require "omniauth/strategies/heroku"
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OmniAuth
4
+ module Heroku
5
+ VERSION = "1.0.0"
6
+ end
7
+ end
@@ -1,20 +1,25 @@
1
- require 'omniauth-oauth2'
1
+ # frozen_string_literal: true
2
+
3
+ require "omniauth-oauth2"
2
4
 
3
5
  module OmniAuth
4
6
  module Strategies
5
7
  class Heroku < OmniAuth::Strategies::OAuth2
6
- AuthUrl = ENV["HEROKU_AUTH_URL"] || "https://id.heroku.com"
7
- ApiUrl = ENV["HEROKU_API_URL"] || "https://api.heroku.com"
8
+ # This style of overriding the default means it can only be done when the class is loaded.
9
+ # Which is problematic for testing, and a bit against the grain of how the base class
10
+ # expects this to work, where consumers would explicitly override by passing in the option.
11
+ AUTH_URL = ENV.fetch("HEROKU_AUTH_URL", "https://id.heroku.com")
12
+ private_constant :AUTH_URL
8
13
 
9
- option :client_options, {
10
- site: AuthUrl,
11
- authorize_url: "#{AuthUrl}/oauth/authorize",
12
- token_url: "#{AuthUrl}/oauth/token"
13
- }
14
+ option(:client_options, {
15
+ site: AUTH_URL,
16
+ authorize_url: "#{AUTH_URL}/oauth/authorize",
17
+ token_url: "#{AUTH_URL}/oauth/token"
18
+ })
14
19
 
15
- # whether we should make another API call to Heroku to fetch
20
+ # Configure whether we make another API call to Heroku to fetch
16
21
  # additional account info like the real user name and email
17
- option :fetch_info
22
+ option :fetch_info, false
18
23
 
19
24
  uid do
20
25
  access_token.params["user_id"]
@@ -22,17 +27,16 @@ module OmniAuth
22
27
 
23
28
  info do
24
29
  if options.fetch_info
25
- email_hash = Digest::MD5.hexdigest(account_info['email'].to_s)
26
- default_image_url = "https://dashboard.heroku.com/ninja-avatar-48x48.png"
27
- image_url = "https://secure.gravatar.com/avatar/#{email_hash}.png?d=#{default_image_url}"
30
+ email_hash = Digest::MD5.hexdigest(account_info["email"].to_s)
31
+ image_url = "https://secure.gravatar.com/avatar/#{email_hash}.png?d=#{DEFAULT_IMAGE_URL}"
28
32
 
29
33
  {
30
- name: account_info["name"],
34
+ name: account_info["name"],
31
35
  email: account_info["email"],
32
- image: image_url,
36
+ image: image_url
33
37
  }
34
38
  else
35
- { name: "Heroku user" } # only mandatory field
39
+ {name: "Heroku user"} # only mandatory field
36
40
  end
37
41
  end
38
42
 
@@ -56,26 +60,30 @@ module OmniAuth
56
60
  end
57
61
  end
58
62
 
59
- def authorize_params
60
- super.tap do |params|
61
- # Allow the scope to be determined dynamically based on the request.
62
- if params.scope.respond_to?(:call)
63
- params.scope = params.scope.call(request)
64
- end
65
- end
66
- end
63
+ private
64
+
65
+ DEFAULT_API_URL = "https://api.heroku.com"
66
+ private_constant :DEFAULT_API_URL
67
+
68
+ DEFAULT_IMAGE_URL = "https://dashboard.heroku.com/ninja-avatar-48x48.png"
69
+ private_constant :DEFAULT_IMAGE_URL
67
70
 
68
71
  def account_info
69
72
  @account_info ||= MultiJson.decode(heroku_api.get("/account").body)
70
73
  end
71
74
 
75
+ def api_url
76
+ @api_url ||= ENV.fetch("HEROKU_API_URL", DEFAULT_API_URL)
77
+ end
78
+
72
79
  def heroku_api
73
80
  @heroku_api ||= Faraday.new(
74
- url: ApiUrl,
81
+ url: api_url,
75
82
  headers: {
76
83
  "Accept" => "application/vnd.heroku+json; version=3",
77
- "Authorization" => "Bearer #{access_token.token}",
78
- })
84
+ "Authorization" => "Bearer #{access_token.token}"
85
+ }
86
+ )
79
87
  end
80
88
 
81
89
  def missing_client_id?
@@ -0,0 +1,39 @@
1
+ require File.expand_path("lib/omniauth/heroku/version", __dir__)
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "omniauth-heroku"
5
+ spec.version = OmniAuth::Heroku::VERSION
6
+ spec.authors = ["Pedro Belo"]
7
+ spec.email = ["pedro@heroku.com"]
8
+
9
+ spec.summary = "OmniAuth strategy for Heroku."
10
+ spec.description = "OmniAuth strategy for Heroku, for apps already using OmniAuth that authenticate against more than one service (eg: Heroku and GitHub), or apps that have specific needs on session management."
11
+ spec.homepage = "https://github.com/heroku/omniauth-heroku"
12
+ spec.license = "MIT"
13
+
14
+ spec.metadata = {
15
+ "homepage_uri" => spec.homepage,
16
+ "source_code_uri" => spec.homepage,
17
+ "bug_tracker_uri" => "#{spec.homepage}/issues",
18
+ "changelog_uri" => "#{spec.homepage}/blob/master/CHANGELOG.md"
19
+ }
20
+
21
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
22
+
23
+ # Specify which files should be added to the gem when it is released.
24
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
25
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
26
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
27
+ end
28
+ spec.bindir = "exe"
29
+ spec.executables = []
30
+ spec.require_paths = ["lib"]
31
+
32
+ spec.add_runtime_dependency("omniauth", [">= 1.9", "< 3"])
33
+ spec.add_runtime_dependency("omniauth-oauth2", "~> 1.7")
34
+
35
+ spec.add_development_dependency("multi_json", "~> 1.12")
36
+ spec.add_development_dependency("rake", "~> 13.0")
37
+ spec.add_development_dependency("rspec", "~> 3.4")
38
+ spec.add_development_dependency("webmock", "~> 3.13")
39
+ end
metadata CHANGED
@@ -1,58 +1,138 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omniauth-heroku
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pedro Belo
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2021-07-09 00:00:00.000000000 Z
11
+ date: 2021-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: omniauth
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '1.9'
20
+ - - "<"
18
21
  - !ruby/object:Gem::Version
19
- version: 1.9.0
22
+ version: '3'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: 1.9.0
29
+ version: '1.9'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '3'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: omniauth-oauth2
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - "~>"
32
38
  - !ruby/object:Gem::Version
33
- version: 1.6.0
39
+ version: '1.7'
34
40
  type: :runtime
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
44
  - - "~>"
39
45
  - !ruby/object:Gem::Version
40
- version: 1.6.0
41
- description: OmniAuth strategy for Heroku.
46
+ version: '1.7'
47
+ - !ruby/object:Gem::Dependency
48
+ name: multi_json
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.12'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.12'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rake
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '13.0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '13.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rspec
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '3.4'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.4'
89
+ - !ruby/object:Gem::Dependency
90
+ name: webmock
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '3.13'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '3.13'
103
+ description: 'OmniAuth strategy for Heroku, for apps already using OmniAuth that authenticate
104
+ against more than one service (eg: Heroku and GitHub), or apps that have specific
105
+ needs on session management.'
42
106
  email:
43
107
  - pedro@heroku.com
44
108
  executables: []
45
109
  extensions: []
46
110
  extra_rdoc_files: []
47
111
  files:
112
+ - ".github/workflows/ci.yml"
113
+ - ".gitignore"
114
+ - ".rspec"
115
+ - CHANGELOG.md
116
+ - Gemfile
117
+ - Gemfile-omniauth1
118
+ - Gemfile-omniauth2
48
119
  - LICENSE
49
120
  - README.md
121
+ - Rakefile
122
+ - bin/rake
123
+ - bin/rspec
50
124
  - lib/omniauth-heroku.rb
125
+ - lib/omniauth/heroku/version.rb
51
126
  - lib/omniauth/strategies/heroku.rb
127
+ - omniauth-heroku.gemspec
52
128
  homepage: https://github.com/heroku/omniauth-heroku
53
129
  licenses:
54
130
  - MIT
55
- metadata: {}
131
+ metadata:
132
+ homepage_uri: https://github.com/heroku/omniauth-heroku
133
+ source_code_uri: https://github.com/heroku/omniauth-heroku
134
+ bug_tracker_uri: https://github.com/heroku/omniauth-heroku/issues
135
+ changelog_uri: https://github.com/heroku/omniauth-heroku/blob/master/CHANGELOG.md
56
136
  post_install_message:
57
137
  rdoc_options: []
58
138
  require_paths:
@@ -61,7 +141,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
61
141
  requirements:
62
142
  - - ">="
63
143
  - !ruby/object:Gem::Version
64
- version: '0'
144
+ version: 2.3.0
65
145
  required_rubygems_version: !ruby/object:Gem::Requirement
66
146
  requirements:
67
147
  - - ">="