omniauth-heroku 0.4.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
  - - ">="