omniauth-hipchat 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 56bdb1a63c254d724a89ab0ea19f4cf4df8c9ad0
4
+ data.tar.gz: 279e2b03788cee9f1f242eb9a374b926ccbf2822
5
+ SHA512:
6
+ metadata.gz: f9d7c38fe5b5ce2f6bea4370947146445f7313f10f572d43669adee55814e8fca1892a87ce5db200ce0e532220432019a33387dca6328a1e61cf61693cd1db5d
7
+ data.tar.gz: 465a07860ba71f1c13f08730b666491090115568c0ded4757899ec0efad56a9f57c41121489214a2a53fdcb023bf8027c6d05f49941e293d91bf5a6bf18dc4b6
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .idea/
19
+ .ruby-version
20
+ .ruby-gemset
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in omniauth-hipchat.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Maciej Paruszewski
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # Omniauth::Hipchat
2
+
3
+ This Gem contains the HipChat strategy for OmniAuth.
4
+
5
+ [![Gem Version](https://badge.fury.io/rb/omniauth-hipchat.svg)](http://badge.fury.io/rb/omniauth-hipchat)
6
+
7
+ ## Before You Begin
8
+
9
+ You should have already installed OmniAuth into your app; if not, read the [OmniAuth README](https://github.com/intridea/omniauth) to get started.
10
+
11
+ Now read documentation about [HipChat integrations](https://www.hipchat.com/docs/apiv2/addons) and create an application. Take note of your API keys.
12
+
13
+ ## Using This Strategy
14
+
15
+ First start by adding this gem to your Gemfile:
16
+
17
+ ```ruby
18
+ gem 'omniauth-hipchat'
19
+ ```
20
+
21
+ If you need to use the latest HEAD version, you can do so with:
22
+
23
+ ```ruby
24
+ gem 'omniauth-hipchat', github: 'pinoss/omniauth-hipchat'
25
+ ```
26
+
27
+ Next, tell OmniAuth about this provider. For a Rails app, your `config/initializers/omniauth.rb` file should look like this:
28
+
29
+ ```ruby
30
+ Rails.application.config.middleware.use OmniAuth::Builder do
31
+ provider :hipchat, "API_KEY", "API_SECRET", scope: "view_group admin_group"
32
+ end
33
+ ```
34
+
35
+ Replace `"API_KEY"` and `"API_SECRET"` with the appropriate values you obtained [earlier](https://www.hipchat.com/docs/apiv2/addons).
36
+
37
+ If you are using [Devise](https://github.com/plataformatec/devise) then it will look like this:
38
+
39
+ ```ruby
40
+ Devise.setup do |config|
41
+ # other stuff...
42
+
43
+ config.omniauth :hipchat, ENV["HIPCHAT_APP_ID"], ENV["HIPCHAT_APP_SECRET"], scope: 'view_group admin_group'
44
+
45
+ # other stuff...
46
+ end
47
+ ```
48
+
49
+ HipChat lets you combine and choose from a [few different scopes](https://www.hipchat.com/docs/apiv2/auth#scopes).
50
+
51
+ ## Contributing
52
+
53
+ 1. Fork it
54
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
55
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
56
+ 4. Push to the branch (`git push origin my-new-feature`)
57
+ 5. Create new Pull Request
58
+
59
+ ## Special Thanks
60
+
61
+ Many thanks to the [omniauth-slack](https://github.com/CanCanCommunity/cancancan/contributors) and [omniauth-reddit contributors](https://github.com/CanCanCommunity/cancancan/contributors). This strategy was inspired by Omniauth Slack and Reddit strategies.
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new do |task|
5
+ task.libs << "test"
6
+ end
7
+
8
+ task :default => :test
@@ -0,0 +1,2 @@
1
+ require 'omniauth-hipchat/version'
2
+ require 'omniauth/strategies/hipchat'
@@ -0,0 +1,5 @@
1
+ module Omniauth
2
+ module Hipchat
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,80 @@
1
+ require 'omniauth/strategies/oauth2'
2
+ require 'base64'
3
+
4
+ module OmniAuth
5
+ module Strategies
6
+ class Hipchat < OmniAuth::Strategies::OAuth2
7
+ option :name, 'hipchat'
8
+
9
+ option :authorize_options, [:scope]
10
+
11
+ option :client_options, {
12
+ site: 'https://api.hipchat.com',
13
+ token_url: '/v2/oauth/token',
14
+ authorize_url: 'https://www.hipchat.com/users/authorize'
15
+ }
16
+
17
+ uid { raw_info['owner']['id'] }
18
+
19
+ info do
20
+ {
21
+ name: raw_info['owner'].to_h['name'],
22
+ email: user_info['email'],
23
+ mention_name: raw_info['owner'].to_h['mention_name'],
24
+ roles: user_info['roles'],
25
+ client_name: raw_info['client'].to_h['name'],
26
+ room: raw_info['client'].to_h['room'],
27
+ title: user_info['title'],
28
+ image: user_info['photo_url'],
29
+ group_avatar: group_info['avatar_url'],
30
+ group_domain: group_info['subdomain'],
31
+ group_id: access_token['group_id'],
32
+ group: group_info['name'],
33
+ plan: group_info['plan'].to_h['type'],
34
+ user_id: raw_info['owner'].to_h['id'],
35
+ is_group_admin: user_info['is_group_admin'],
36
+ xmpp_jid: user_info['xmpp_jid'],
37
+ time_zone: user_info['timezone']
38
+ }
39
+ end
40
+
41
+ extra do
42
+ {
43
+ raw_info: raw_info,
44
+ user_info: user_info,
45
+ group_info: group_info
46
+ }
47
+ end
48
+
49
+ def raw_info
50
+ @raw_info ||= access_token.get("/v2/oauth/token/#{access_token.token}").parsed
51
+ end
52
+
53
+ def user_info
54
+ return {} unless group_info_allowed?
55
+ @user_info ||= access_token.get("/v2/user/#{raw_info['owner']['id']}").parsed
56
+ end
57
+
58
+ def group_info
59
+ return {} unless group_info_allowed?
60
+ @group_info ||= access_token.get("/v2/group/#{access_token['group_id']}").parsed
61
+ end
62
+
63
+ def build_access_token
64
+ options.token_params.merge!(:headers => {'Authorization' => basic_auth_header })
65
+ super
66
+ end
67
+
68
+ def basic_auth_header
69
+ "Basic " + Base64.strict_encode64("#{options[:client_id]}:#{options[:client_secret]}")
70
+ end
71
+
72
+ def group_info_allowed?
73
+ return false unless options['scope']
74
+ group_info_scopes = ['view_room']
75
+ scopes = options['scope'].split(' ')
76
+ (scopes & group_info_scopes).any?
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ require File.expand_path('../lib/omniauth-hipchat/version', __FILE__)
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = "omniauth-hipchat"
6
+ spec.version = Omniauth::Hipchat::VERSION
7
+ spec.authors = ["Maciej Paruszewski"]
8
+ spec.email = ["maciek.paruszewski@gmail.com"]
9
+ spec.description = %q{OmniAuth strategy for HipChat}
10
+ spec.summary = %q{OmniAuth strategy for HipChat}
11
+ spec.homepage = "https://github.com/pinoss/omniauth-hipchat.git"
12
+ spec.license = "MIT"
13
+
14
+ spec.files = `git ls-files`.split($/)
15
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
+ spec.require_paths = ["lib"]
18
+
19
+ spec.add_runtime_dependency 'omniauth-oauth2', "~> 1.3.1"
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "minitest"
24
+ spec.add_development_dependency "mocha"
25
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,56 @@
1
+ require "bundler/setup"
2
+ require "minitest/autorun"
3
+ require "mocha/setup"
4
+ require "omniauth/strategies/hipchat"
5
+
6
+ OmniAuth.config.test_mode = true
7
+
8
+ module BlockTestHelper
9
+ def test(name, &blk)
10
+ method_name = "test_#{name.gsub(/\s+/, "_")}"
11
+ raise "Method already defined: #{method_name}" if instance_methods.include?(method_name.to_sym)
12
+ define_method method_name, &blk
13
+ end
14
+ end
15
+
16
+ module CustomAssertions
17
+ def assert_has_key(key, hash, msg = nil)
18
+ msg = message(msg) { "Expected #{hash.inspect} to have key #{key.inspect}" }
19
+ assert hash.has_key?(key), msg
20
+ end
21
+
22
+ def refute_has_key(key, hash, msg = nil)
23
+ msg = message(msg) { "Expected #{hash.inspect} not to have key #{key.inspect}" }
24
+ refute hash.has_key?(key), msg
25
+ end
26
+ end
27
+
28
+ class TestCase < Minitest::Test
29
+ extend BlockTestHelper
30
+ include CustomAssertions
31
+ end
32
+
33
+ class StrategyTestCase < TestCase
34
+ def setup
35
+ @request = stub("Request")
36
+ @request.stubs(:params).returns({})
37
+ @request.stubs(:cookies).returns({})
38
+ @request.stubs(:env).returns({})
39
+ @request.stubs(:scheme).returns({})
40
+ @request.stubs(:ssl?).returns(false)
41
+
42
+ @client_id = "123"
43
+ @client_secret = "53cr3tz"
44
+ end
45
+
46
+ def strategy
47
+ @strategy ||= begin
48
+ args = [@client_id, @client_secret, @options].compact
49
+ OmniAuth::Strategies::Hipchat.new(nil, *args).tap do |strategy|
50
+ strategy.stubs(:request).returns(@request)
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ Dir[File.expand_path("../support/**/*", __FILE__)].each &method(:require)
@@ -0,0 +1,85 @@
1
+ # NOTE it would be useful if this lived in omniauth-oauth2 eventually
2
+ module OAuth2StrategyTests
3
+ def self.included(base)
4
+ base.class_eval do
5
+ include ClientTests
6
+ include AuthorizeParamsTests
7
+ include CSRFAuthorizeParamsTests
8
+ include TokenParamsTests
9
+ end
10
+ end
11
+
12
+ module ClientTests
13
+ extend BlockTestHelper
14
+
15
+ test "should be initialized with symbolized client_options" do
16
+ @options = { :client_options => { "authorize_url" => "https://example.com" } }
17
+ assert_equal "https://example.com", strategy.client.options[:authorize_url]
18
+ end
19
+ end
20
+
21
+ module AuthorizeParamsTests
22
+ extend BlockTestHelper
23
+
24
+ test "should include any authorize params passed in the :authorize_params option" do
25
+ @options = { :authorize_params => { :foo => "bar", :baz => "zip" } }
26
+ assert_equal "bar", strategy.authorize_params["foo"]
27
+ assert_equal "zip", strategy.authorize_params["baz"]
28
+ end
29
+
30
+ test "should include top-level options that are marked as :authorize_options" do
31
+ @options = { :authorize_options => [:scope, :foo], :scope => "bar", :foo => "baz" }
32
+ assert_equal "bar", strategy.authorize_params["scope"]
33
+ assert_equal "baz", strategy.authorize_params["foo"]
34
+ end
35
+
36
+ test "should exclude top-level options that are not passed" do
37
+ @options = { :authorize_options => [:bar] }
38
+ refute_has_key :bar, strategy.authorize_params
39
+ refute_has_key "bar", strategy.authorize_params
40
+ end
41
+ end
42
+
43
+ module CSRFAuthorizeParamsTests
44
+ extend BlockTestHelper
45
+
46
+ test "should store random state in the session when none is present in authorize or request params" do
47
+ assert_includes strategy.authorize_params.keys, "state"
48
+ refute_empty strategy.authorize_params["state"]
49
+ refute_empty strategy.session["omniauth.state"]
50
+ assert_equal strategy.authorize_params["state"], strategy.session["omniauth.state"]
51
+ end
52
+
53
+ test "should not store state in the session when present in authorize params vs. a random one" do
54
+ @options = { :authorize_params => { :state => "bar" } }
55
+ refute_empty strategy.authorize_params["state"]
56
+ refute_equal "bar", strategy.authorize_params[:state]
57
+ refute_empty strategy.session["omniauth.state"]
58
+ refute_equal "bar", strategy.session["omniauth.state"]
59
+ end
60
+
61
+ test "should not store state in the session when present in request params vs. a random one" do
62
+ @request.stubs(:params).returns({ "state" => "foo" })
63
+ refute_empty strategy.authorize_params["state"]
64
+ refute_equal "foo", strategy.authorize_params[:state]
65
+ refute_empty strategy.session["omniauth.state"]
66
+ refute_equal "foo", strategy.session["omniauth.state"]
67
+ end
68
+ end
69
+
70
+ module TokenParamsTests
71
+ extend BlockTestHelper
72
+
73
+ test "should include any authorize params passed in the :token_params option" do
74
+ @options = { :token_params => { :foo => "bar", :baz => "zip" } }
75
+ assert_equal "bar", strategy.token_params["foo"]
76
+ assert_equal "zip", strategy.token_params["baz"]
77
+ end
78
+
79
+ test "should include top-level options that are marked as :token_options" do
80
+ @options = { :token_options => [:scope, :foo], :scope => "bar", :foo => "baz" }
81
+ assert_equal "bar", strategy.token_params["scope"]
82
+ assert_equal "baz", strategy.token_params["foo"]
83
+ end
84
+ end
85
+ end
data/test/test.rb ADDED
@@ -0,0 +1,100 @@
1
+ require "helper"
2
+ require "omniauth-hipchat"
3
+
4
+ class StrategyTest < StrategyTestCase
5
+ include OAuth2StrategyTests
6
+ end
7
+
8
+ class ClientTest < StrategyTestCase
9
+ test "has correct HipChat site" do
10
+ assert_equal "https://api.hipchat.com", strategy.client.site
11
+ end
12
+
13
+ test "has correct authorize url" do
14
+ assert_equal "https://www.hipchat.com/users/authorize", strategy.client.options[:authorize_url]
15
+ end
16
+
17
+ test "has correct token url" do
18
+ assert_equal "/v2/oauth/token", strategy.client.options[:token_url]
19
+ end
20
+ end
21
+
22
+ class CallbackUrlTest < StrategyTestCase
23
+ test "returns the default callback url" do
24
+ url_base = "http://auth.request.com"
25
+ @request.stubs(:url).returns("#{url_base}/some/page")
26
+ strategy.stubs(:script_name).returns("") # as not to depend on Rack env
27
+ assert_equal "#{url_base}/auth/hipchat/callback", strategy.callback_url
28
+ end
29
+
30
+ test "returns path from callback_path option" do
31
+ @options = { :callback_path => "/auth/hipchat/done"}
32
+ url_base = "http://auth.request.com"
33
+ @request.stubs(:url).returns("#{url_base}/page/path")
34
+ strategy.stubs(:script_name).returns("") # as not to depend on Rack env
35
+ assert_equal "#{url_base}/auth/hipchat/done", strategy.callback_url
36
+ end
37
+ end
38
+
39
+ class UidTest < StrategyTestCase
40
+ def setup
41
+ super
42
+ strategy.stubs(:raw_info).returns("owner" => { "id" => "1231234" })
43
+ end
44
+
45
+ test "returns the user ID from raw_info" do
46
+ assert_equal "1231234", strategy.uid
47
+ end
48
+ end
49
+
50
+ class CredentialsTest < StrategyTestCase
51
+ def setup
52
+ super
53
+ @access_token = stub("OAuth2::AccessToken")
54
+ @access_token.stubs(:token)
55
+ @access_token.stubs(:expires?)
56
+ @access_token.stubs(:expires_at)
57
+ @access_token.stubs(:refresh_token)
58
+ strategy.stubs(:access_token).returns(@access_token)
59
+ end
60
+
61
+ test "returns a Hash" do
62
+ assert_kind_of Hash, strategy.credentials
63
+ end
64
+
65
+ test "returns the token" do
66
+ @access_token.stubs(:token).returns("123")
67
+ assert_equal "123", strategy.credentials["token"]
68
+ end
69
+
70
+ test "returns the expiry status" do
71
+ @access_token.stubs(:expires?).returns(true)
72
+ assert strategy.credentials["expires"]
73
+
74
+ @access_token.stubs(:expires?).returns(false)
75
+ refute strategy.credentials["expires"]
76
+ end
77
+
78
+ test "returns the refresh token and expiry time when expiring" do
79
+ ten_mins_from_now = (Time.now + 600).to_i
80
+ @access_token.stubs(:expires?).returns(true)
81
+ @access_token.stubs(:refresh_token).returns("321")
82
+ @access_token.stubs(:expires_at).returns(ten_mins_from_now)
83
+ assert_equal "321", strategy.credentials["refresh_token"]
84
+ assert_equal ten_mins_from_now, strategy.credentials["expires_at"]
85
+ end
86
+
87
+ test "does not return the refresh token when test is nil and expiring" do
88
+ @access_token.stubs(:expires?).returns(true)
89
+ @access_token.stubs(:refresh_token).returns(nil)
90
+ assert_nil strategy.credentials["refresh_token"]
91
+ refute_has_key "refresh_token", strategy.credentials
92
+ end
93
+
94
+ test "does not return the refresh token when not expiring" do
95
+ @access_token.stubs(:expires?).returns(false)
96
+ @access_token.stubs(:refresh_token).returns("XXX")
97
+ assert_nil strategy.credentials["refresh_token"]
98
+ refute_has_key "refresh_token", strategy.credentials
99
+ end
100
+ end
metadata ADDED
@@ -0,0 +1,129 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: omniauth-hipchat
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Maciej Paruszewski
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-11-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: omniauth-oauth2
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.3.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.3.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: mocha
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: OmniAuth strategy for HipChat
84
+ email:
85
+ - maciek.paruszewski@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - Gemfile
92
+ - LICENSE.txt
93
+ - README.md
94
+ - Rakefile
95
+ - lib/omniauth-hipchat.rb
96
+ - lib/omniauth-hipchat/version.rb
97
+ - lib/omniauth/strategies/hipchat.rb
98
+ - omniauth-hipchat.gemspec
99
+ - test/helper.rb
100
+ - test/support/shared_examples.rb
101
+ - test/test.rb
102
+ homepage: https://github.com/pinoss/omniauth-hipchat.git
103
+ licenses:
104
+ - MIT
105
+ metadata: {}
106
+ post_install_message:
107
+ rdoc_options: []
108
+ require_paths:
109
+ - lib
110
+ required_ruby_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ requirements: []
121
+ rubyforge_project:
122
+ rubygems_version: 2.4.6
123
+ signing_key:
124
+ specification_version: 4
125
+ summary: OmniAuth strategy for HipChat
126
+ test_files:
127
+ - test/helper.rb
128
+ - test/support/shared_examples.rb
129
+ - test/test.rb