add-to-org 2.2.0 → 3.0.3

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
- SHA1:
3
- metadata.gz: 351c099fc7771a5adc6fd806223371fe4d5ab588
4
- data.tar.gz: 5616531e6f75f524d8e7af3ca68ea2a34d95c664
2
+ SHA256:
3
+ metadata.gz: d6e1d519910bd9dae03bcb2c8cea47fcebb6fb188c48d7103dfec6e1a40df664
4
+ data.tar.gz: 5ef8eb34932716326573c30beb922c55b2549bf5cb2d0ce2cd273ddd8ef409b1
5
5
  SHA512:
6
- metadata.gz: 96fe29f18f7ca1e94e0c27e24c5fa8096b7ca7d6abc85531cff9ed759c0e12d8c848d1b3e08975ff1245b0b9882d1dfa634f63cb90ea03bdbe8de616d8152209
7
- data.tar.gz: 5bb857c019684da4da650e9160f556b3df7ad35aa6796b96d2baf81ff707a086dd5b8c0c3232737cf7c01ca5106ed1f263593ad82479a8b0a12a4fd79f013bbe
6
+ metadata.gz: 336633b4e2062a6e8de5411bf38ae7cab6b085a626b7af679f83a880d5781d3713933df4bf5434d2b3f09b532dafe177364f88e02274fd2c8657540acfa7b983
7
+ data.tar.gz: 4b41e21b69c44f9109b47ba0408dc6ff63400d481bbc5738be4a035c35a0597a1e41d0d2045942749dba06fcf769d8e01561a6908a7b0009666f8e0cff6ce5b6
data/.bowerrc ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "directory": "lib/add-to-org/public/vendor"
3
+ }
@@ -0,0 +1,24 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ pull_request:
7
+ branches: [master]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+
13
+ steps:
14
+ - name: Checkout
15
+ uses: actions/checkout@v2
16
+
17
+ - name: Set up Ruby
18
+ uses: ruby/setup-ruby@v1
19
+ with:
20
+ ruby-version: 3.0
21
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
22
+
23
+ - name: Run tests
24
+ run: script/cibuild
data/.gitignore CHANGED
@@ -2,3 +2,10 @@
2
2
  .bundle
3
3
  *.gem
4
4
  Gemfile.lock
5
+ /lib/add-to-org/public/vendor/jquery
6
+ /lib/add-to-org/public/vendor/bootstrap/grunt
7
+ /lib/add-to-org/public/vendor/bootstrap/js
8
+ /lib/add-to-org/public/vendor/bootstrap/less
9
+ /lib/add-to-org/public/vendor/bootstrap/nuget
10
+ /lib/add-to-org/public/vendor/bootstrap/*.md
11
+ /lib/add-to-org/public/vendor/bootstrap/*.js
data/.rubocop.yml ADDED
@@ -0,0 +1,8 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ require:
4
+ - rubocop-performance
5
+ - rubocop-rspec
6
+
7
+ AllCops:
8
+ NewCops: enable
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,100 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2021-10-07 20:24:39 UTC using RuboCop version 1.22.1.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 1
10
+ # Configuration parameters: Include.
11
+ # Include: **/*.gemspec
12
+ Gemspec/RequiredRubyVersion:
13
+ Exclude:
14
+ - 'add-to-org.gemspec'
15
+
16
+ # Offense count: 3
17
+ # Configuration parameters: IgnoredMethods.
18
+ Lint/AmbiguousBlockAssociation:
19
+ Exclude:
20
+ - 'lib/add-to-org.rb'
21
+
22
+ # Offense count: 1
23
+ # Configuration parameters: AllowedMethods.
24
+ # AllowedMethods: enums
25
+ Lint/ConstantDefinitionInBlock:
26
+ Exclude:
27
+ - 'spec/add-to-org-helpers_spec.rb'
28
+
29
+ # Offense count: 4
30
+ # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
31
+ # IgnoredMethods: refine
32
+ Metrics/BlockLength:
33
+ Max: 88
34
+
35
+ # Offense count: 1
36
+ Naming/AccessorMethodName:
37
+ Exclude:
38
+ - 'lib/add-to-org.rb'
39
+
40
+ # Offense count: 3
41
+ # Configuration parameters: ExpectMatchingDefinition, CheckDefinitionPathHierarchy, Regex, IgnoreExecutableScripts, AllowedAcronyms.
42
+ # AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
43
+ Naming/FileName:
44
+ Exclude:
45
+ - 'lib/add-to-org.rb'
46
+ - 'spec/add-to-org-helpers_spec.rb'
47
+ - 'spec/add-to-org_spec.rb'
48
+
49
+ # Offense count: 3
50
+ # Configuration parameters: IgnoredMetadata.
51
+ RSpec/DescribeClass:
52
+ Exclude:
53
+ - '**/spec/features/**/*'
54
+ - '**/spec/requests/**/*'
55
+ - '**/spec/routing/**/*'
56
+ - '**/spec/system/**/*'
57
+ - '**/spec/views/**/*'
58
+ - 'spec/add-to-org_spec.rb'
59
+
60
+ # Offense count: 6
61
+ # Configuration parameters: CountAsOne.
62
+ RSpec/ExampleLength:
63
+ Max: 16
64
+
65
+ # Offense count: 14
66
+ # Configuration parameters: AssignmentOnly.
67
+ RSpec/InstanceVariable:
68
+ Exclude:
69
+ - 'spec/add-to-org-helpers_spec.rb'
70
+ - 'spec/add-to-org_spec.rb'
71
+
72
+ # Offense count: 1
73
+ RSpec/LeakyConstantDeclaration:
74
+ Exclude:
75
+ - 'spec/add-to-org-helpers_spec.rb'
76
+
77
+ # Offense count: 1
78
+ RSpec/MultipleDescribes:
79
+ Exclude:
80
+ - 'spec/add-to-org_spec.rb'
81
+
82
+ # Offense count: 9
83
+ RSpec/MultipleExpectations:
84
+ Max: 6
85
+
86
+ # Offense count: 3
87
+ # Configuration parameters: AllowedConstants.
88
+ Style/Documentation:
89
+ Exclude:
90
+ - 'spec/**/*'
91
+ - 'test/**/*'
92
+ - 'lib/add-to-org.rb'
93
+ - 'lib/add-to-org/helpers.rb'
94
+
95
+ # Offense count: 1
96
+ # Cop supports --auto-correct.
97
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
98
+ # URISchemes: http, https
99
+ Layout/LineLength:
100
+ Max: 124
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
2
4
 
3
5
  gemspec
data/README.md CHANGED
@@ -10,10 +10,35 @@ Once set up, simply swap out your app's domain for any GitHub URL. E.g., `github
10
10
 
11
11
  ## Setup
12
12
 
13
- 1. Create [an oauth app](github.com/settings/applications/new)
14
- 2. Create a personal access token for a user with admin rights to the organization
13
+ *Pro-tip: for a quickstart on how to set up the app, see the [add-to-org demo app](https://github.com/benbalter/add-to-org-demo).*
14
+
15
+ ### Credentials
16
+
17
+ You'll need a few different credentials for things to work:
18
+
19
+ #### A bot account
20
+
21
+ You'll need a dedicated "bot" account to add users to the organization:
22
+
23
+ 1. [Create a bot account](https://github.com/signup) (a standard GitHub account not used by a human) that has *admin* rights to your organization.
24
+ 2. [Create a personal access token](https://github.com/settings/tokens/new) for that user, with `admin:org` scope.
25
+
26
+ #### An OAuth application
27
+
28
+ You'll also need to create an OAUth application to validate users:
29
+
30
+ 1. Create an OAauth application *within your organization* via `https://github.com/organizations/[YOUR-ORGANIZATION-NAME]/settings/applications/new`
31
+ 2. The homepage URL should be the URL to your production instance.
32
+ 3. You can leave the callback URL blank. The default is fine.
33
+
34
+ ## Developing locally and deploying
35
+
36
+ *Pro-tip: for a quickstart on how to set up the app, see the [add-to-org demo app](https://github.com/benbalter/add-to-org-demo)*
37
+
38
+ 1. Create [an oauth app](github.com/settings/applications/new) (see above)
39
+ 2. Create a personal access token for a user with admin rights to the organization (see above)
15
40
  3. Add `gem 'add-to-org' to your project's Gemfile
16
- 4. Add the following to a `config.ru` file:
41
+ 4. Add the following to your project's `config.ru` file:
17
42
 
18
43
  ```ruby
19
44
  require 'add-to-org'
@@ -31,40 +56,58 @@ The following environmental values should be set:
31
56
  * `GITHUB_TOKEN` - A personal access token for a user with admin rights to the organization
32
57
  * `CONTACT_EMAIL` - Point of contact to point users to if something goes wrong
33
58
 
34
- You'll also need to monkey patch a validation method to determine if a user should be added, e.g.:
59
+ ### Customizing the validator
60
+
61
+ For Add to Org to work, you'll also need to define a custom validator. You can do this in your `configu.ru`, or in a separate file included into `config.ru`. Here's an example of a validator that confirms the user has a verified `@github.com` email address:
35
62
 
36
63
  ```ruby
37
64
  require 'add-to-org'
38
65
 
39
- module AddToOrg
40
- class App < Sinatra::Base
41
- def valid?
42
- verified_emails.any? { |email| email[:email] =~ /@github\.com$/}
43
- end
44
- end
66
+ AddToOrg.set_validator do |github_user, verified_emails, client|
67
+ verified_emails.any? { |email| email[:email] =~ /@github\.com\z/ }
45
68
  end
69
+
70
+ run AddToOrg::App
46
71
  ```
47
72
 
48
- ## Customizing Views
73
+ If you prefer, you can also pass the validator as a proc (or lambda):
74
+
75
+ ```ruby
76
+ AddToOrg.validator = proc { |github_user, verified_emails, client|
77
+ verified_emails.any? { |email| email[:email] =~ /@github\.com\z/ }
78
+ }
79
+ ```
49
80
 
50
- There are three views, `success`, `forbidden`, and `error`. They're pretty boring by default, so you may want to swap them out for something a bit my snazzy. There are two ways to do that:
81
+ The validator will receive three arguments to help you validate the user meets your criteria:
82
+
83
+ * `github_user` - the Warden user, which will contain information like username, company, and human-readable name
84
+ * `verified_emails` - an array of the user's verified emails
85
+ * `client` - An [Octokit.rb](https://github.com/octokit/octokit.rb) client, preset with the user's OAuth token.
86
+
87
+ The validator should return `true` if you'd like the current user added to the organization, or `false` if you'd like the user's request to be denied.
88
+
89
+ ### Customizing Views
90
+
91
+ There are three views, `success`, `forbidden`, and `error`. They're pretty boring by default, so you may want to swap them out for something a bit my snazzy. If you had a views directory along side your `config.ru`, you can do so like this in your `config.ru` file:
51
92
 
52
93
  ```ruby
53
- module AddToOrg
54
- class App < Sinatra::Base
55
- set :views, "path/to/your/views"
56
- end
57
- end
94
+ require 'add-to-org'
95
+
96
+ AddToOrgs.views_dir = File.expand_path("./views", File.dirname(__FILE__))
97
+
98
+ run AddToOrg::App
58
99
  ```
59
100
 
60
- or by overwriting the `success`, `forbidden`, and `error` methods entirely:
101
+ These are just sinatra `.erb` views. Take a look at [the default views](https://github.com/benbalter/add-to-org/tree/master/lib/add-to-org/views) for an example.
102
+
103
+ ### Customizing static assets
104
+
105
+ You can also do the same with `AddToOrg.public_dir` for serving static assets (AddToOrg comes bundled with Bootstrap by default).
61
106
 
62
107
  ```ruby
63
- module AddToOrg
64
- class App < Sinatra::Base
65
- def success(locals={})
66
- halt erb :some_template, :locals => locals
67
- end
68
- end
69
- end
108
+ require 'add-to-org'
109
+
110
+ AddToOrgs.public_dir = File.expand_path("./public", File.dirname(__FILE__))
111
+
112
+ run AddToOrg::App
70
113
  ```
data/Rakefile CHANGED
@@ -1,12 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rubygems/package_task'
2
4
  require 'rubygems/specification'
3
5
  require 'bundler'
4
6
 
5
- task :default => [:spec]
7
+ task default: [:spec]
6
8
 
7
9
  require 'rspec/core/rake_task'
8
- desc "Run specs"
10
+ desc 'Run specs'
9
11
  RSpec::Core::RakeTask.new do |t|
10
12
  t.pattern = 'spec/**/*_spec.rb'
11
- t.rspec_opts = ["--order", "rand", "--color"]
13
+ t.rspec_opts = ['--order', 'rand', '--color']
12
14
  end
data/add-to-org.gemspec CHANGED
@@ -1,29 +1,32 @@
1
- require File.expand_path('../lib/add-to-org/version', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('lib/add-to-org/version', __dir__)
2
4
 
3
5
  Gem::Specification.new do |s|
4
- s.name = "add-to-org"
5
- s.summary = "A simple Oauth App to automatically add users to an organization"
6
- s.description = "A simple Oauth App to automatically add users to an organization."
6
+ s.name = 'add-to-org'
7
+ s.summary = 'A simple Oauth App to automatically add users to an organization'
8
+ s.description = 'A simple Oauth App to automatically add users to an organization.'
7
9
  s.version = AddToOrg::VERSION
8
- s.authors = ["Ben Balter"]
9
- s.email = "ben.balter@github.com"
10
- s.homepage = "https://github.com/benbalter/add-to-org"
11
- s.licenses = ["MIT"]
10
+ s.authors = ['Ben Balter']
11
+ s.email = 'ben.balter@github.com'
12
+ s.homepage = 'https://github.com/benbalter/add-to-org'
13
+ s.licenses = ['MIT']
12
14
 
13
15
  s.files = `git ls-files`.split("\n")
14
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
- s.require_paths = ["lib"]
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
18
+ s.require_paths = ['lib']
17
19
 
18
- s.require_paths = ["lib"]
19
- s.add_dependency "warden-github", "~> 1.1"
20
- s.add_dependency "sinatra_auth_github", "~> 1.1"
21
- s.add_dependency "octokit", "~> 4.0"
22
- s.add_dependency "rack-ssl-enforcer", "~> 0.2"
23
- s.add_dependency "dotenv", "~> 2.0"
24
- s.add_dependency "rake", "~> 10.3"
25
- s.add_development_dependency "rspec", "~> 3.1"
26
- s.add_development_dependency "rack-test", "~> 0.6"
27
- s.add_development_dependency "webmock", "~> 1.2 "
28
- s.add_development_dependency "pry", "~> 0.10"
20
+ s.add_dependency 'dotenv', '~> 2.0'
21
+ s.add_dependency 'octokit', '~> 4.0'
22
+ s.add_dependency 'rack-ssl-enforcer', '~> 0.2'
23
+ s.add_dependency 'rake'
24
+ s.add_dependency 'sinatra_auth_github', '~> 2.0'
25
+ s.add_development_dependency 'pry'
26
+ s.add_development_dependency 'rack-test'
27
+ s.add_development_dependency 'rspec', '~> 3.1'
28
+ s.add_development_dependency 'rubocop'
29
+ s.add_development_dependency 'rubocop-performance'
30
+ s.add_development_dependency 'rubocop-rspec'
31
+ s.add_development_dependency 'webmock'
29
32
  end
data/bower.json ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "add-to-org",
3
+ "homepage": "https://github.com/benbalter/add-to-org",
4
+ "authors": [
5
+ "Ben Balter <ben.balter@github.com>"
6
+ ],
7
+ "description": "A simple Oauth App to automatically add users to an organization",
8
+ "main": "script/server",
9
+ "moduleType": [],
10
+ "license": "MIT",
11
+ "private": true,
12
+ "dependencies": {}
13
+ }
@@ -1,20 +1,27 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module AddToOrg
2
4
  module Helpers
5
+ # query api for the user's verified emails
6
+ def verified_emails
7
+ emails = client.emails accept: 'application/vnd.github.v3'
8
+ emails.select(&:verified)
9
+ end
10
+
11
+ def valid?
12
+ AddToOrg.validator.call(github_user, verified_emails, client)
13
+ end
14
+
15
+ private
3
16
 
4
17
  # user client
5
18
  def client
6
- @client ||= Octokit::Client.new :access_token => github_user.token
19
+ @client ||= Octokit::Client.new access_token: github_user.token
7
20
  end
8
21
 
9
- # new org admin client
22
+ # org admin client
10
23
  def sudo_client
11
- @sudo_client ||= Octokit::Client.new :access_token => ENV['GITHUB_TOKEN']
12
- end
13
-
14
- # query api for the user's verified emails
15
- def verified_emails
16
- emails = client.emails :accept => 'application/vnd.github.v3'
17
- emails.select { |email| email.verified }
24
+ @sudo_client ||= Octokit::Client.new access_token: ENV['GITHUB_TOKEN']
18
25
  end
19
26
 
20
27
  # true if user is already a member of the org
@@ -22,10 +29,6 @@ module AddToOrg
22
29
  client.organization_member? org_id, github_user.login
23
30
  end
24
31
 
25
- def valid?
26
- raise "You must define a custom valid? method to determine eligibility"
27
- end
28
-
29
32
  def team_id
30
33
  ENV['GITHUB_TEAM_ID']
31
34
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module AddToOrg
2
- VERSION = "2.2.0"
4
+ VERSION = '3.0.3'
3
5
  end
@@ -1,12 +1,5 @@
1
- <html>
2
- <head>
3
- <style>
4
- body { padding: 20px; }
5
- </style>
6
- </head>
7
- <body>
8
- <h1>Ruh roh</h1>
9
- <p>Looks like something went wrong.</p>
10
- <p>Please contact <a href="mailto:<%= ENV['CONTACT_EMAIL'] %>"><%= ENV['CONTACT_EMAIL'] %></a>.</p>
11
- </body>
12
- </html>
1
+ <h1>Ruh roh</h1>
2
+
3
+ <p>Looks like something went wrong.</p>
4
+
5
+ <p>Please contact <a href="mailto:<%= ENV['CONTACT_EMAIL'] %>"><%= ENV['CONTACT_EMAIL'] %></a>.</p>
@@ -1,12 +1,5 @@
1
- <html>
2
- <head>
3
- <style>
4
- body { padding: 20px; }
5
- </style>
6
- </head>
7
- <body>
8
- <h1>Sorry Charlie</h1>
9
- <p>We're unable to verify your eligibility at this time.</p>
10
- <p>Please contact <a href="mailto:<%= ENV['CONTACT_EMAIL'] %>"><%= ENV['CONTACT_EMAIL'] %></a> if you believe this is in error.</p>
11
- </body>
12
- </html>
1
+ <h1>Sorry Charlie</h1>
2
+
3
+ <p>We're unable to verify your eligibility at this time.</p>
4
+
5
+ <p>Please contact <a href="mailto:<%= ENV['CONTACT_EMAIL'] %>"><%= ENV['CONTACT_EMAIL'] %></a> if you believe this is in error.</p>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Join <%= ENV['GITHUB_ORG_ID'] %></title>
7
+ <style>
8
+ body { text-align: center; padding-top: 100px; }
9
+ </style>
10
+ </head>
11
+ <body>
12
+ <div class="container">
13
+ <%= yield %>
14
+ </div>
15
+ </body>
16
+ </html>
@@ -1,12 +1,5 @@
1
- <html>
2
- <head>
3
- <style>
4
- body { padding: 20px; }
5
- </style>
6
- </head>
7
- <body>
8
- <h1>You're all set</h1>
9
- <p class="lead">You simply need to <a href="https://github.com/orgs/<%= @org_id %>/invitation?return_to=<%= ERB::Util.html_escape(redirect) %>">confirm your invitation to join the organization</a> on GitHub.</p>
10
- <p>Once confirmed, you will have access to <a href="<%= ERB::Util.html_escape(redirect) %>"><%= ERB::Util.html_escape(redirect) %></a>, the requested URL.</h1>
11
- </body>
12
- </html>
1
+ <h1>You're all set</h1>
2
+
3
+ <p class="lead">You simply need to <a href="https://github.com/orgs/<%= org_id %>/invitation?return_to=<%= ERB::Util.html_escape(redirect) %>">confirm your invitation to join the organization</a> on GitHub.</p>
4
+
5
+ <p>Once confirmed, you will have access to <a href="<%= ERB::Util.html_escape(redirect) %>"><%= ERB::Util.html_escape(redirect) %></a>, the requested URL.</h1>
data/lib/add-to-org.rb CHANGED
@@ -1,28 +1,61 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'octokit'
2
4
  require 'sinatra_auth_github'
3
5
  require 'dotenv'
4
6
  require_relative 'add-to-org/helpers'
5
7
 
6
- Dotenv.load
7
-
8
8
  module AddToOrg
9
- class App < Sinatra::Base
9
+ def self.root
10
+ File.expand_path './add-to-org', File.dirname(__FILE__)
11
+ end
12
+
13
+ def self.views_dir
14
+ @views_dir ||= File.expand_path 'views', AddToOrg.root
15
+ end
10
16
 
17
+ def self.views_dir=(dir)
18
+ @views_dir = dir
19
+ end
20
+
21
+ def self.public_dir
22
+ @public_dir ||= File.expand_path 'public', AddToOrg.root
23
+ end
24
+
25
+ def self.public_dir=(dir)
26
+ @public_dir = dir
27
+ end
28
+
29
+ def self.validator=(validator)
30
+ @validator = validator
31
+ end
32
+
33
+ def self.set_validator(&block)
34
+ @validator = block
35
+ end
36
+
37
+ def self.validator
38
+ @validator ||= proc { raise 'You must define a custom validator to determine eligibility' }
39
+ end
40
+
41
+ class App < Sinatra::Base
11
42
  include AddToOrg::Helpers
12
43
 
13
44
  set :github_options, {
14
- :scopes => "read:org,user:email"
45
+ scopes: 'read:org,user:email'
15
46
  }
16
47
 
17
48
  use Rack::Session::Cookie, {
18
- :http_only => true,
19
- :secret => ENV['SESSION_SECRET'] || SecureRandom.hex
49
+ http_only: true,
50
+ secret: ENV['SESSION_SECRET'] || SecureRandom.hex
20
51
  }
21
52
 
22
53
  ENV['WARDEN_GITHUB_VERIFIER_SECRET'] ||= SecureRandom.hex
23
54
  register Sinatra::Auth::Github
24
55
 
25
- set :views, File.expand_path("add-to-org/views", File.dirname(__FILE__))
56
+ set :views, proc { AddToOrg.views_dir }
57
+ set :root, proc { AddToOrg.root }
58
+ set :public_folder, proc { AddToOrg.public_dir }
26
59
 
27
60
  # require ssl
28
61
  configure :production do
@@ -32,12 +65,12 @@ module AddToOrg
32
65
 
33
66
  # dat auth
34
67
  before do
35
- session[:return_to] = request.url #store requested URL for post-auth redirect
68
+ session[:return_to] = request.url # store requested URL for post-auth redirect
36
69
  authenticate!
37
70
  end
38
71
 
39
- def success(locals={})
40
- halt erb :success, :locals => locals
72
+ def success(locals = {})
73
+ halt erb :success, locals: locals
41
74
  end
42
75
 
43
76
  def forbidden
@@ -51,17 +84,18 @@ module AddToOrg
51
84
  end
52
85
 
53
86
  # request a GitHub (authenticated) URL
54
- get "/*" do
55
-
87
+ get '/*' do
56
88
  path = request.path || "/#{team_id}"
57
89
  halt redirect "https://github.com#{path}", 302 if member?
58
90
  forbidden unless valid?
59
91
 
60
92
  if add
61
- success({ :redirect => "https://github.com#{path}", :org_id => org_id })
93
+ success({ redirect: "https://github.com#{path}", org_id: org_id })
62
94
  else
63
95
  error
64
96
  end
65
97
  end
66
98
  end
67
99
  end
100
+
101
+ Dotenv.load unless AddToOrg::App.production?
data/script/cibuild CHANGED
@@ -4,4 +4,5 @@
4
4
  set -e
5
5
 
6
6
  bundle exec rake spec
7
+ bundle exec rubocop
7
8
  bundle exec gem build add-to-org.gemspec
@@ -1,80 +1,88 @@
1
- require "spec_helper"
1
+ # frozen_string_literal: true
2
2
 
3
- describe "AddToOrgHelpers" do
3
+ require 'spec_helper'
4
4
 
5
+ describe 'AddToOrgHelpers' do
5
6
  class TestHelper
6
7
  include AddToOrg::Helpers
7
8
 
8
9
  def github_user
9
- User.make({"login" => "benbaltertest"}, "asdf1234")
10
+ User.make({ 'login' => 'benbaltertest' }, 'asdf1234')
10
11
  end
11
12
 
12
- def initialize(path=nil)
13
+ def initialize(path = nil)
13
14
  @path = path
14
15
  end
15
16
 
16
17
  def request
17
- Rack::Request.new("PATH_INFO" => @path)
18
+ Rack::Request.new('PATH_INFO' => @path)
18
19
  end
19
20
  end
20
21
 
21
- before(:each) do
22
+ before do
22
23
  @helper = TestHelper.new
23
24
  end
24
25
 
25
- it "initializes the client" do
26
- expect(@helper.client.class).to eql(Octokit::Client)
27
- expect(@helper.client.instance_variable_get("@access_token")).to eql("asdf1234")
26
+ it 'initializes the client' do
27
+ expect(@helper.send(:client).class).to eql(Octokit::Client)
28
+ expect(@helper.send(:client).instance_variable_get('@access_token')).to eql('asdf1234')
28
29
  end
29
30
 
30
- it "initializes the sudo client" do
31
- with_env "GITHUB_TOKEN", "SUDO_TOKEN" do
32
- expect(@helper.sudo_client.class).to eql(Octokit::Client)
33
- expect(@helper.sudo_client.instance_variable_get("@access_token")).to eql("SUDO_TOKEN")
31
+ it 'initializes the sudo client' do
32
+ with_env 'GITHUB_TOKEN', 'SUDO_TOKEN' do
33
+ expect(@helper.send(:sudo_client).class).to eql(Octokit::Client)
34
+ expect(@helper.send(:sudo_client).instance_variable_get('@access_token')).to eql('SUDO_TOKEN')
34
35
  end
35
36
  end
36
37
 
37
- it "retrieves a users verified emails" do
38
- stub_request(:get, "https://api.github.com/user/emails").
39
- to_return(:status => 200, :body => fixture("emails.json"), :headers => { 'Content-Type'=>'application/json' })
40
- expect(@helper.verified_emails.count).to eql(1)
41
- expect(@helper.verified_emails.first[:email]).to eql("octocat@github.com")
38
+ it 'retrieves a users verified emails' do
39
+ stub_request(:get, 'https://api.github.com/user/emails')
40
+ .to_return(status: 200, body: fixture('emails.json'), headers: { 'Content-Type' => 'application/json' })
41
+ expect(@helper.verified_emails.count).to be(1)
42
+ expect(@helper.verified_emails.first[:email]).to eql('octocat@github.com')
42
43
  end
43
44
 
44
- it "retrieves the org id" do
45
- with_env "GITHUB_ORG_ID", "some_org" do
46
- expect(@helper.org_id).to eql("some_org")
45
+ it 'retrieves the org id' do
46
+ with_env 'GITHUB_ORG_ID', 'some_org' do
47
+ expect(@helper.send(:org_id)).to eql('some_org')
47
48
  end
48
49
  end
49
50
 
50
- it "retrieves the team id" do
51
- with_env "GITHUB_TEAM_ID", "1234" do
52
- expect(@helper.team_id).to eql("1234")
51
+ it 'retrieves the team id' do
52
+ with_env 'GITHUB_TEAM_ID', '1234' do
53
+ expect(@helper.send(:team_id)).to eql('1234')
53
54
  end
54
55
  end
55
56
 
56
- it "knows if a user is an org member" do
57
- with_env "GITHUB_ORG_ID", "some_org" do
58
- stub_request(:get, "https://api.github.com/orgs/some_org/members/benbaltertest").
59
- to_return(:status => 204)
60
- expect(@helper.member?).to eql(true)
57
+ it 'knows if a user is an org member' do
58
+ with_env 'GITHUB_ORG_ID', 'some_org' do
59
+ stub_request(:get, 'https://api.github.com/orgs/some_org/members/benbaltertest')
60
+ .to_return(status: 204)
61
+ expect(@helper.send(:member?)).to be(true)
61
62
 
62
- stub_request(:get, "https://api.github.com/orgs/some_org/members/benbaltertest").
63
- to_return(:status => 404)
64
- expect(@helper.member?).to eql(false)
63
+ stub_request(:get, 'https://api.github.com/orgs/some_org/members/benbaltertest')
64
+ .to_return(status: 404)
65
+ expect(@helper.send(:member?)).to be(false)
65
66
  end
66
67
  end
67
68
 
68
- it "knows how to add a mebmer to an org" do
69
- with_env "GITHUB_ORG_ID", "some_org" do
70
- stub = stub_request(:put, "https://api.github.com/teams/memberships/benbaltertest").
71
- to_return(:status => 204)
72
- @helper.add
73
- expect(stub).to have_been_requested
69
+ it 'knows how to add a member to an org' do
70
+ with_env 'GITHUB_ORG_ID', 'some_org' do
71
+ with_env 'GITHUB_TEAM_ID', '1234' do
72
+ stub = stub_request(:put, 'https://api.github.com/teams/1234/memberships/benbaltertest')
73
+ .to_return(status: 204)
74
+ @helper.send(:add)
75
+ expect(stub).to have_been_requested
76
+ end
74
77
  end
75
78
  end
76
79
 
77
- it "throws an error if valid? is not defined" do
78
- expect { @helper.valid? }.to raise_error("You must define a custom valid? method to determine eligibility")
80
+ it 'throws an error if valid? is not defined' do
81
+ stub_request(:get, 'https://api.github.com/user/emails')
82
+ .to_return(status: 200, body: fixture('emails.json'), headers: { 'Content-Type' => 'application/json' })
83
+
84
+ AddToOrg.validator = nil
85
+ error = 'You must define a custom validator to determine eligibility'
86
+ expect { @helper.valid? }.to raise_error(error)
79
87
  end
80
88
  end
@@ -1,32 +1,38 @@
1
- require "spec_helper"
1
+ # frozen_string_literal: true
2
2
 
3
- describe "logged out user" do
3
+ require 'spec_helper'
4
4
 
5
+ describe 'config' do
6
+ %i[views_dir public_dir validator].each do |var|
7
+ after do
8
+ AddToOrg.send("#{var}=", nil)
9
+ end
10
+
11
+ it "accepts #{var}" do
12
+ expected = SecureRandom.hex
13
+ AddToOrg.send("#{var}=", expected)
14
+ expect(AddToOrg.send(var)).to eql(expected)
15
+ end
16
+ end
17
+ end
18
+
19
+ describe 'logged out user' do
5
20
  include Rack::Test::Methods
6
21
 
7
22
  def app
8
23
  AddToOrg::App
9
24
  end
10
25
 
11
- it "asks you to log in" do
12
- get "/"
13
- expect(last_response.status).to eql(302)
26
+ it 'asks you to log in' do
27
+ get '/'
28
+ expect(last_response.status).to be(302)
14
29
  expect(last_response.headers['Location']).to match(%r{^https://github\.com/login/oauth/authorize})
15
30
  end
16
31
  end
17
32
 
18
- describe "logged in user" do
19
-
33
+ describe 'logged in user' do
20
34
  include Rack::Test::Methods
21
35
 
22
- module AddToOrg
23
- class App < Sinatra::Base
24
- def valid?
25
- verified_emails.any? { |email| email[:email] =~ /@github\.com$/}
26
- end
27
- end
28
- end
29
-
30
36
  def app
31
37
  AddToOrg::App
32
38
  end
@@ -36,71 +42,98 @@ describe "logged in user" do
36
42
  login_as @user
37
43
  end
38
44
 
39
- it "redirects if the user is a member" do
40
- with_env "GITHUB_ORG_ID", "some_org" do
41
- stub_request(:get, "https://api.github.com/orgs/some_org/members/benbaltertest").
42
- to_return(:status => 204)
43
- get "/"
44
- expect(last_response.status).to eql(302)
45
- expect(last_response.headers['Location']).to eql("https://github.com/")
46
-
47
- get "/foo"
48
- expect(last_response.status).to eql(302)
49
- expect(last_response.headers['Location']).to eql("https://github.com/foo")
50
-
51
- get "/foo/bar"
52
- expect(last_response.status).to eql(302)
53
- expect(last_response.headers['Location']).to eql("https://github.com/foo/bar")
45
+ it 'redirects if the user is a member' do
46
+ with_env 'GITHUB_ORG_ID', 'some_org' do
47
+ stub_request(:get, 'https://api.github.com/orgs/some_org/members/benbaltertest')
48
+ .to_return(status: 204)
49
+ get '/'
50
+ expect(last_response.status).to be(302)
51
+ expect(last_response.headers['Location']).to eql('https://github.com/')
52
+
53
+ get '/foo'
54
+ expect(last_response.status).to be(302)
55
+ expect(last_response.headers['Location']).to eql('https://github.com/foo')
56
+
57
+ get '/foo/bar'
58
+ expect(last_response.status).to be(302)
59
+ expect(last_response.headers['Location']).to eql('https://github.com/foo/bar')
54
60
  end
55
61
  end
56
62
 
57
- it "denies acccess to invalid users" do
58
- with_env "GITHUB_ORG_ID", "some_org" do
59
- stub_request(:get, "https://api.github.com/orgs/some_org/members/benbaltertest").
60
- to_return(:status => 404)
61
-
62
- stub_request(:get, "https://api.github.com/user/emails").
63
- to_return(:status => 200, :body => fixture("invalid_emails.json"), :headers => { 'Content-Type'=>'application/json' })
64
-
65
- get "/"
66
- expect(last_response.status).to eql(403)
67
- expect(last_response.body).to match(/We're unable to verify your eligibility at this time/)
68
- end
69
- end
63
+ %i[proc block lambda].each do |method|
64
+ describe "with validator passed as a #{method}" do
65
+ before do
66
+ case method
67
+ when :block
68
+ AddToOrg.set_validator do |_github_user, verified_emails, _client|
69
+ verified_emails.any? { |email| email[:email] =~ /@github\.com$/ }
70
+ end
71
+ when :proc
72
+ AddToOrg.validator = proc { |_github_user, verified_emails, _client|
73
+ verified_emails.any? { |email| email[:email] =~ /@github\.com$/ }
74
+ }
75
+ when :lambda
76
+ AddToOrg.validator = lambda { |_github_user, verified_emails, _client|
77
+ verified_emails.any? { |email| email[:email] =~ /@github\.com$/ }
78
+ }
79
+ end
80
+ end
70
81
 
71
- it "tries to add valid users" do
72
- with_env "GITHUB_ORG_ID", "some_org" do
73
- stub_request(:get, "https://api.github.com/orgs/some_org/members/benbaltertest").
74
- to_return(:status => 404)
82
+ it 'denies acccess to invalid users' do
83
+ with_env 'GITHUB_ORG_ID', 'some_org' do
84
+ stub_request(:get, 'https://api.github.com/orgs/some_org/members/benbaltertest')
85
+ .to_return(status: 404)
75
86
 
76
- stub_request(:get, "https://api.github.com/user/emails").
77
- to_return(:status => 200, :body => fixture("emails.json"), :headers => { 'Content-Type'=>'application/json' })
87
+ stub_request(:get, 'https://api.github.com/user/emails')
88
+ .to_return(status: 200, body: fixture('invalid_emails.json'), headers: { 'Content-Type' => 'application/json' })
78
89
 
79
- stub = stub_request(:put, "https://api.github.com/teams/memberships/benbaltertest").
80
- to_return(:status => 204)
90
+ get '/'
91
+ expect(last_response.status).to be(403)
92
+ expect(last_response.body).to match(/We're unable to verify your eligibility at this time/)
93
+ end
94
+ end
81
95
 
82
- get "/"
83
- expect(stub).to have_been_requested
84
- expect(last_response.status).to eql(200)
85
- expect(last_response.body).to match(/confirm your invitation to join the organization/)
86
- end
87
- end
96
+ it 'tries to add valid users' do
97
+ with_env 'GITHUB_ORG_ID', 'some_org' do
98
+ with_env 'GITHUB_TEAM_ID', '1234' do
99
+ stub_request(:get, 'https://api.github.com/orgs/some_org/members/benbaltertest')
100
+ .to_return(status: 404)
101
+
102
+ stub_request(:get, 'https://api.github.com/user/emails')
103
+ .to_return(status: 200, body: fixture('emails.json'), headers: { 'Content-Type' => 'application/json' })
104
+
105
+ stub = stub_request(:put, 'https://api.github.com/teams/1234/memberships/benbaltertest')
106
+ .to_return(status: 204)
107
+
108
+ get '/foo'
109
+ expect(stub).to have_been_requested
110
+ expect(last_response.status).to be(200)
111
+ expect(last_response.body).to match(/confirm your invitation to join the organization/)
112
+ expect(last_response.body).to match(%r{https://github.com/orgs/some_org/invitation})
113
+ expect(last_response.body).to match(%r{\?return_to=https://github.com/foo})
114
+ end
115
+ end
116
+ end
88
117
 
89
- it "includes the requested URL" do
90
- with_env "GITHUB_ORG_ID", "some_org" do
91
- stub_request(:get, "https://api.github.com/orgs/some_org/members/benbaltertest").
92
- to_return(:status => 404)
118
+ it 'includes the requested URL' do
119
+ with_env 'GITHUB_ORG_ID', 'some_org' do
120
+ with_env 'GITHUB_TEAM_ID', '1234' do
121
+ stub_request(:get, 'https://api.github.com/orgs/some_org/members/benbaltertest')
122
+ .to_return(status: 404)
93
123
 
94
- stub_request(:get, "https://api.github.com/user/emails").
95
- to_return(:status => 200, :body => fixture("emails.json"), :headers => { 'Content-Type'=>'application/json' })
124
+ stub_request(:get, 'https://api.github.com/user/emails')
125
+ .to_return(status: 200, body: fixture('emails.json'), headers: { 'Content-Type' => 'application/json' })
96
126
 
97
- stub = stub_request(:put, "https://api.github.com/teams/memberships/benbaltertest").
98
- to_return(:status => 204)
127
+ stub = stub_request(:put, 'https://api.github.com/teams/1234/memberships/benbaltertest')
128
+ .to_return(status: 204)
99
129
 
100
- get "/foo/bar"
101
- expect(stub).to have_been_requested
102
- expect(last_response.status).to eql(200)
103
- expect(last_response.body).to match(Regexp.new('<a href="https://github.com/foo/bar">https://github.com/foo/bar</a>'))
130
+ get '/foo/bar'
131
+ expect(stub).to have_been_requested
132
+ expect(last_response.status).to be(200)
133
+ expect(last_response.body).to match(Regexp.new('<a href="https://github.com/foo/bar">https://github.com/foo/bar</a>'))
134
+ end
135
+ end
136
+ end
104
137
  end
105
138
  end
106
139
  end
data/spec/spec_helper.rb CHANGED
@@ -1,15 +1,20 @@
1
- require "bundler/setup"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
2
4
  require 'fileutils'
5
+ require 'securerandom'
3
6
 
4
7
  ENV['RACK_ENV'] = 'test'
5
- $:.push File.join(File.dirname(__FILE__), '..', 'lib')
8
+ ENV['GITHUB_CLIENT_ID'] = 'CLIENT_ID'
9
+ ENV['GITHUB_CLIENT_SECRET'] = 'CLIENT_SECRET'
10
+ $LOAD_PATH.push File.join(File.dirname(__FILE__), '..', 'lib')
6
11
 
7
12
  require 'rack/test'
8
13
  require 'sinatra/auth/github'
9
14
  require 'sinatra/auth/github/test/test_helper'
10
15
  require 'webmock/rspec'
11
16
 
12
- require_relative "../lib/add-to-org"
17
+ require_relative '../lib/add-to-org'
13
18
  WebMock.disable_net_connect!
14
19
 
15
20
  RSpec.configure do |config|
@@ -24,7 +29,6 @@ def fixture(fixture)
24
29
  File.open(fixture_path(fixture)).read
25
30
  end
26
31
 
27
-
28
32
  def with_env(key, value)
29
33
  old_env = ENV[key]
30
34
  ENV[key] = value
@@ -33,16 +37,16 @@ def with_env(key, value)
33
37
  end
34
38
 
35
39
  class User < Warden::GitHub::User
36
- def self.make(attrs = {}, token=nil)
40
+ def self.make(attrs = {}, token = nil)
37
41
  default_attrs = {
38
- 'login' => "test_user",
39
- 'name' => "Test User",
40
- 'email' => "test@example.com",
41
- 'company' => "GitHub",
42
- 'gravatar_id' => 'a'*32,
43
- 'avatar_url' => 'https://a249.e.akamai.net/assets.github.com/images/gravatars/gravatar-140.png?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png'
42
+ 'login' => 'test_user',
43
+ 'name' => 'Test User',
44
+ 'email' => 'test@example.com',
45
+ 'company' => 'GitHub',
46
+ 'gravatar_id' => 'a' * 32,
47
+ 'avatar_url' => 'https://a249.e.akamai.net/assets.github.com/images/gravatars/gravatar-140.png?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png'
44
48
  }
45
49
  default_attrs.merge! attrs
46
- User.new(default_attrs,token)
50
+ User.new(default_attrs, token)
47
51
  end
48
52
  end
metadata CHANGED
@@ -1,73 +1,73 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: add-to-org
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 3.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Balter
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-16 00:00:00.000000000 Z
11
+ date: 2021-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: warden-github
14
+ name: dotenv
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.1'
19
+ version: '2.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.1'
26
+ version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: sinatra_auth_github
28
+ name: octokit
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.1'
33
+ version: '4.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.1'
40
+ version: '4.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: octokit
42
+ name: rack-ssl-enforcer
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '4.0'
47
+ version: '0.2'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '4.0'
54
+ version: '0.2'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rack-ssl-enforcer
56
+ name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '0.2'
61
+ version: '0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '0.2'
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: dotenv
70
+ name: sinatra_auth_github
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
@@ -81,19 +81,33 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '2.0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rake
84
+ name: pry
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '10.3'
90
- type: :runtime
89
+ version: '0'
90
+ type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rack-test
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
95
109
  - !ruby/object:Gem::Version
96
- version: '10.3'
110
+ version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: rspec
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -109,66 +123,85 @@ dependencies:
109
123
  - !ruby/object:Gem::Version
110
124
  version: '3.1'
111
125
  - !ruby/object:Gem::Dependency
112
- name: rack-test
126
+ name: rubocop
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - "~>"
129
+ - - ">="
116
130
  - !ruby/object:Gem::Version
117
- version: '0.6'
131
+ version: '0'
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - "~>"
136
+ - - ">="
123
137
  - !ruby/object:Gem::Version
124
- version: '0.6'
138
+ version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
- name: webmock
140
+ name: rubocop-performance
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
- - - "~>"
143
+ - - ">="
130
144
  - !ruby/object:Gem::Version
131
- version: '1.2'
145
+ version: '0'
132
146
  type: :development
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
- - - "~>"
150
+ - - ">="
137
151
  - !ruby/object:Gem::Version
138
- version: '1.2'
152
+ version: '0'
139
153
  - !ruby/object:Gem::Dependency
140
- name: pry
154
+ name: rubocop-rspec
141
155
  requirement: !ruby/object:Gem::Requirement
142
156
  requirements:
143
- - - "~>"
157
+ - - ">="
144
158
  - !ruby/object:Gem::Version
145
- version: '0.10'
159
+ version: '0'
146
160
  type: :development
147
161
  prerelease: false
148
162
  version_requirements: !ruby/object:Gem::Requirement
149
163
  requirements:
150
- - - "~>"
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: webmock
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
151
179
  - !ruby/object:Gem::Version
152
- version: '0.10'
180
+ version: '0'
153
181
  description: A simple Oauth App to automatically add users to an organization.
154
182
  email: ben.balter@github.com
155
183
  executables: []
156
184
  extensions: []
157
185
  extra_rdoc_files: []
158
186
  files:
187
+ - ".bowerrc"
188
+ - ".github/workflows/ci.yml"
159
189
  - ".gitignore"
160
- - ".ruby-version"
190
+ - ".rubocop.yml"
191
+ - ".rubocop_todo.yml"
161
192
  - ".travis.yml"
162
193
  - Gemfile
163
194
  - LICENSE.md
164
195
  - README.md
165
196
  - Rakefile
166
197
  - add-to-org.gemspec
198
+ - bower.json
167
199
  - lib/add-to-org.rb
168
200
  - lib/add-to-org/helpers.rb
169
201
  - lib/add-to-org/version.rb
170
202
  - lib/add-to-org/views/error.erb
171
203
  - lib/add-to-org/views/forbidden.erb
204
+ - lib/add-to-org/views/layout.erb
172
205
  - lib/add-to-org/views/success.erb
173
206
  - script/bootstrap
174
207
  - script/cibuild
@@ -183,7 +216,7 @@ homepage: https://github.com/benbalter/add-to-org
183
216
  licenses:
184
217
  - MIT
185
218
  metadata: {}
186
- post_install_message:
219
+ post_install_message:
187
220
  rdoc_options: []
188
221
  require_paths:
189
222
  - lib
@@ -198,9 +231,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
198
231
  - !ruby/object:Gem::Version
199
232
  version: '0'
200
233
  requirements: []
201
- rubyforge_project:
202
- rubygems_version: 2.4.8
203
- signing_key:
234
+ rubygems_version: 3.2.28
235
+ signing_key:
204
236
  specification_version: 4
205
237
  summary: A simple Oauth App to automatically add users to an organization
206
238
  test_files:
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 2.2.3