omniauth-myspace 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
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
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 John Ferlito
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.
@@ -0,0 +1,36 @@
1
+ # Omniauth::Myspace
2
+
3
+ MySpace OAuth2 strategy for OmniAuth 1.0
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'omniauth-myspace'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install omniauth-myspace
18
+
19
+ ## Usage
20
+
21
+ Here's a quick example, adding the middleware to a Rails app in `config/initializers/omniauth.rb`:
22
+
23
+ ```ruby
24
+ Rails.application.config.middleware.use OmniAuth::Builder do
25
+ provider :myspace, ENV['MYSPACE_KEY'], ENV['MYSPACE_SECRET']
26
+ end
27
+ ```
28
+
29
+
30
+ ## Contributing
31
+
32
+ 1. Fork it
33
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
34
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
35
+ 4. Push to the branch (`git push origin my-new-feature`)
36
+ 5. Create new Pull Request
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env rake
2
+ require 'bundler/gem_tasks'
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :default => :spec
@@ -0,0 +1 @@
1
+ require 'omniauth/myspace'
@@ -0,0 +1,2 @@
1
+ require 'omniauth/myspace/version'
2
+ require 'omniauth/strategies/myspace'
@@ -0,0 +1,5 @@
1
+ module OmniAuth
2
+ module Myspace
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,39 @@
1
+ require 'omniauth-oauth'
2
+ require 'multi_json'
3
+
4
+ module OmniAuth
5
+ module Strategies
6
+ class Myspace < OmniAuth::Strategies::OAuth
7
+ option :name, 'myspace'
8
+
9
+ option :client_options, {
10
+ :site => 'http://api.myspace.com',
11
+ :authorize_path => '/authorize',
12
+ :access_token_path => '/access_token',
13
+ :request_token_path => '/request_token',
14
+ :http_method => 'get',
15
+ }
16
+
17
+ uid { raw_info['id'] }
18
+
19
+ info do
20
+ {
21
+ :id => raw_info['id'],
22
+ :nickname => raw_info['nickname'],
23
+ :name => raw_info['displayName'],
24
+ :image => raw_info['thumbnailUrl'],
25
+ }
26
+ end
27
+
28
+ extra do
29
+ {
30
+ 'raw_info' => raw_info
31
+ }
32
+ end
33
+
34
+ def raw_info
35
+ @raw_info ||= MultiJson.decode(access_token.get('/v2/people/@me/@self?format=json').body)['entry']
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/omniauth/myspace/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["John Ferlito"]
6
+ gem.email = ["johnf@inodes.org"]
7
+ gem.description = %q{MySpace strategy for omniauth}
8
+ gem.summary = %q{MySpace strategy for omniauth}
9
+ gem.homepage = 'https://github.com/johnf/omniauth-myspace'
10
+
11
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
+ gem.files = `git ls-files`.split("\n")
13
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ gem.name = "omniauth-myspace"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = OmniAuth::Myspace::VERSION
17
+
18
+ gem.add_runtime_dependency 'omniauth-oauth'
19
+ gem.add_runtime_dependency 'multi_json'
20
+
21
+ gem.add_development_dependency 'rspec'
22
+ gem.add_development_dependency 'rake'
23
+ end
@@ -0,0 +1,332 @@
1
+ require 'spec_helper'
2
+ require 'omniauth-myspace'
3
+ #require 'openssl'
4
+ #require 'base64'
5
+
6
+ describe OmniAuth::Strategies::Myspace do
7
+ it_should_behave_like 'an oauth2 strategy'
8
+
9
+ # before :each do
10
+ # @request = double('Request')
11
+ # @request.stub(:params) { {} }
12
+ # @request.stub(:cookies) { {} }
13
+ #
14
+ # @client_id = '123'
15
+ # @client_secret = '53cr3tz'
16
+ # end
17
+ #
18
+ # subject do
19
+ # args = [@client_id, @client_secret, @options].compact
20
+ # OmniAuth::Strategies::Facebook.new(nil, *args).tap do |strategy|
21
+ # strategy.stub(:request) { @request }
22
+ # end
23
+ # end
24
+ #
25
+ #
26
+ # describe '#client' do
27
+ # it 'has correct Facebook site' do
28
+ # subject.client.site.should eq('https://graph.facebook.com')
29
+ # end
30
+ #
31
+ # it 'has correct authorize url' do
32
+ # subject.client.options[:authorize_url].should eq('/oauth/authorize')
33
+ # end
34
+ #
35
+ # it 'has correct token url' do
36
+ # subject.client.options[:token_url].should eq('/oauth/access_token')
37
+ # end
38
+ # end
39
+ #
40
+ # describe '#callback_url' do
41
+ # it "returns value from #authorize_options" do
42
+ # url = 'http://auth.myapp.com/auth/fb/callback'
43
+ # @options = { :authorize_options => { :callback_url => url } }
44
+ # subject.callback_url.should eq(url)
45
+ # end
46
+ #
47
+ # it "callback_url from request" do
48
+ # url_base = 'http://auth.request.com'
49
+ # @request.stub(:url) { "#{url_base}/page/path" }
50
+ # subject.stub(:script_name) { "" } # to not depend from Rack env
51
+ # subject.callback_url.should eq("#{url_base}/auth/facebook/callback")
52
+ # end
53
+ # end
54
+ #
55
+ # describe '#authorize_params' do
56
+ # it 'includes default scope for email and offline access' do
57
+ # subject.authorize_params.should be_a(Hash)
58
+ # subject.authorize_params[:scope].should eq('email,offline_access')
59
+ # end
60
+ #
61
+ # it 'includes display parameter from request when present' do
62
+ # @request.stub(:params) { { 'display' => 'touch' } }
63
+ # subject.authorize_params.should be_a(Hash)
64
+ # subject.authorize_params[:display].should eq('touch')
65
+ # end
66
+ #
67
+ # it 'includes state parameter from request when present' do
68
+ # @request.stub(:params) { { 'state' => 'some_state' } }
69
+ # subject.authorize_params.should be_a(Hash)
70
+ # subject.authorize_params[:state].should eq('some_state')
71
+ # end
72
+ # end
73
+ #
74
+ # describe '#token_params' do
75
+ # it 'has correct parse strategy' do
76
+ # subject.token_params[:parse].should eq(:query)
77
+ # end
78
+ # end
79
+ #
80
+ # describe '#access_token_options' do
81
+ # it 'has correct param name by default' do
82
+ # subject.access_token_options[:param_name].should eq('access_token')
83
+ # end
84
+ #
85
+ # it 'has correct header format by default' do
86
+ # subject.access_token_options[:header_format].should eq('OAuth %s')
87
+ # end
88
+ # end
89
+ #
90
+ # describe '#uid' do
91
+ # before :each do
92
+ # subject.stub(:raw_info) { { 'id' => '123' } }
93
+ # end
94
+ #
95
+ # it 'returns the id from raw_info' do
96
+ # subject.uid.should eq('123')
97
+ # end
98
+ # end
99
+ #
100
+ # describe '#info' do
101
+ # before :each do
102
+ # @raw_info ||= { 'name' => 'Fred Smith' }
103
+ # subject.stub(:raw_info) { @raw_info }
104
+ # end
105
+ #
106
+ # context 'when optional data is not present in raw info' do
107
+ # it 'has no email key' do
108
+ # subject.info.should_not have_key('email')
109
+ # end
110
+ #
111
+ # it 'has no nickname key' do
112
+ # subject.info.should_not have_key('nickname')
113
+ # end
114
+ #
115
+ # it 'has no first name key' do
116
+ # subject.info.should_not have_key('first_name')
117
+ # end
118
+ #
119
+ # it 'has no last name key' do
120
+ # subject.info.should_not have_key('last_name')
121
+ # end
122
+ #
123
+ # it 'has no location key' do
124
+ # subject.info.should_not have_key('location')
125
+ # end
126
+ #
127
+ # it 'has no description key' do
128
+ # subject.info.should_not have_key('description')
129
+ # end
130
+ #
131
+ # it 'has no urls' do
132
+ # subject.info.should_not have_key('urls')
133
+ # end
134
+ # end
135
+ #
136
+ # context 'when data is present in raw info' do
137
+ # it 'returns the name' do
138
+ # subject.info['name'].should eq('Fred Smith')
139
+ # end
140
+ #
141
+ # it 'returns the email' do
142
+ # @raw_info['email'] = 'fred@smith.com'
143
+ # subject.info['email'].should eq('fred@smith.com')
144
+ # end
145
+ #
146
+ # it 'returns the username as nickname' do
147
+ # @raw_info['username'] = 'fredsmith'
148
+ # subject.info['nickname'].should eq('fredsmith')
149
+ # end
150
+ #
151
+ # it 'returns the first name' do
152
+ # @raw_info['first_name'] = 'Fred'
153
+ # subject.info['first_name'].should eq('Fred')
154
+ # end
155
+ #
156
+ # it 'returns the last name' do
157
+ # @raw_info['last_name'] = 'Smith'
158
+ # subject.info['last_name'].should eq('Smith')
159
+ # end
160
+ #
161
+ # it 'returns the location name as location' do
162
+ # @raw_info['location'] = { 'id' => '104022926303756', 'name' => 'Palo Alto, California' }
163
+ # subject.info['location'].should eq('Palo Alto, California')
164
+ # end
165
+ #
166
+ # it 'returns bio as description' do
167
+ # @raw_info['bio'] = 'I am great'
168
+ # subject.info['description'].should eq('I am great')
169
+ # end
170
+ #
171
+ # it 'returns the square format facebook avatar url' do
172
+ # @raw_info['id'] = '321'
173
+ # subject.info['image'].should eq('http://graph.facebook.com/321/picture?type=square')
174
+ # end
175
+ #
176
+ # it 'returns the Facebook link as the Facebook url' do
177
+ # @raw_info['link'] = 'http://www.facebook.com/fredsmith'
178
+ # subject.info['urls'].should be_a(Hash)
179
+ # subject.info['urls']['Facebook'].should eq('http://www.facebook.com/fredsmith')
180
+ # end
181
+ #
182
+ # it 'returns website url' do
183
+ # @raw_info['website'] = 'https://my-wonderful-site.com'
184
+ # subject.info['urls'].should be_a(Hash)
185
+ # subject.info['urls']['Website'].should eq('https://my-wonderful-site.com')
186
+ # end
187
+ #
188
+ # it 'return both Facebook link and website urls' do
189
+ # @raw_info['link'] = 'http://www.facebook.com/fredsmith'
190
+ # @raw_info['website'] = 'https://my-wonderful-site.com'
191
+ # subject.info['urls'].should be_a(Hash)
192
+ # subject.info['urls']['Facebook'].should eq('http://www.facebook.com/fredsmith')
193
+ # subject.info['urls']['Website'].should eq('https://my-wonderful-site.com')
194
+ # end
195
+ # end
196
+ # end
197
+ #
198
+ # describe '#raw_info' do
199
+ # before :each do
200
+ # @access_token = double('OAuth2::AccessToken')
201
+ # subject.stub(:access_token) { @access_token }
202
+ # end
203
+ #
204
+ # it 'performs a GET to https://graph.facebook.com/me' do
205
+ # @access_token.stub(:get) { double('OAuth2::Response').as_null_object }
206
+ # @access_token.should_receive(:get).with('/me')
207
+ # subject.raw_info
208
+ # end
209
+ #
210
+ # it 'returns a Hash' do
211
+ # @access_token.stub(:get).with('/me') do
212
+ # raw_response = double('Faraday::Response')
213
+ # raw_response.stub(:body) { '{ "ohai": "thar" }' }
214
+ # raw_response.stub(:status) { 200 }
215
+ # raw_response.stub(:headers) { { 'Content-Type' => 'application/json' } }
216
+ # OAuth2::Response.new(raw_response)
217
+ # end
218
+ # subject.raw_info.should be_a(Hash)
219
+ # subject.raw_info['ohai'].should eq('thar')
220
+ # end
221
+ # end
222
+ #
223
+ # describe '#credentials' do
224
+ # before :each do
225
+ # @access_token = double('OAuth2::AccessToken')
226
+ # @access_token.stub(:token)
227
+ # @access_token.stub(:expires?)
228
+ # @access_token.stub(:expires_at)
229
+ # @access_token.stub(:refresh_token)
230
+ # subject.stub(:access_token) { @access_token }
231
+ # end
232
+ #
233
+ # it 'returns a Hash' do
234
+ # subject.credentials.should be_a(Hash)
235
+ # end
236
+ #
237
+ # it 'returns the token' do
238
+ # @access_token.stub(:token) { '123' }
239
+ # subject.credentials['token'].should eq('123')
240
+ # end
241
+ #
242
+ # it 'returns the expiry status' do
243
+ # @access_token.stub(:expires?) { true }
244
+ # subject.credentials['expires'].should eq(true)
245
+ #
246
+ # @access_token.stub(:expires?) { false }
247
+ # subject.credentials['expires'].should eq(false)
248
+ # end
249
+ #
250
+ # it 'returns the refresh token and expiry time when expiring' do
251
+ # ten_mins_from_now = (Time.now + 600).to_i
252
+ # @access_token.stub(:expires?) { true }
253
+ # @access_token.stub(:refresh_token) { '321' }
254
+ # @access_token.stub(:expires_at) { ten_mins_from_now }
255
+ # subject.credentials['refresh_token'].should eq('321')
256
+ # subject.credentials['expires_at'].should eq(ten_mins_from_now)
257
+ # end
258
+ #
259
+ # it 'does not return the refresh token when it is nil and expiring' do
260
+ # @access_token.stub(:expires?) { true }
261
+ # @access_token.stub(:refresh_token) { nil }
262
+ # subject.credentials['refresh_token'].should be_nil
263
+ # subject.credentials.should_not have_key('refresh_token')
264
+ # end
265
+ #
266
+ # it 'does not return the refresh token when not expiring' do
267
+ # @access_token.stub(:expires?) { false }
268
+ # @access_token.stub(:refresh_token) { 'XXX' }
269
+ # subject.credentials['refresh_token'].should be_nil
270
+ # subject.credentials.should_not have_key('refresh_token')
271
+ # end
272
+ # end
273
+ #
274
+ # describe '#extra' do
275
+ # before :each do
276
+ # @raw_info = { 'name' => 'Fred Smith' }
277
+ # subject.stub(:raw_info) { @raw_info }
278
+ # end
279
+ #
280
+ # it 'returns a Hash' do
281
+ # subject.extra.should be_a(Hash)
282
+ # end
283
+ #
284
+ # it 'contains raw info' do
285
+ # subject.extra.should eq({ 'raw_info' => @raw_info })
286
+ # end
287
+ # end
288
+ #
289
+ # describe '#signed_request' do
290
+ # context 'cookie not present' do
291
+ # it 'is nil' do
292
+ # subject.send(:signed_request).should be_nil
293
+ # end
294
+ # end
295
+ #
296
+ # context 'cookie present' do
297
+ # before :each do
298
+ # @payload = {
299
+ # 'algorithm' => 'HMAC-SHA256',
300
+ # 'code' => 'm4c0d3z',
301
+ # 'issued_at' => Time.now.to_i,
302
+ # 'user_id' => '123456'
303
+ # }
304
+ #
305
+ # @request.stub(:cookies) do
306
+ # { "fbsr_#{@client_id}" => signed_request(@payload, @client_secret) }
307
+ # end
308
+ # end
309
+ #
310
+ # it 'parses the access code out from the cookie' do
311
+ # subject.send(:signed_request).should eq(@payload)
312
+ # end
313
+ # end
314
+ # end
315
+ #
316
+ #private
317
+ #
318
+ # def signed_request(payload, secret)
319
+ # encoded_payload = base64_encode_url(MultiJson.encode(payload))
320
+ # encoded_signature = base64_encode_url(signature(encoded_payload, secret))
321
+ # [encoded_signature, encoded_payload].join('.')
322
+ # end
323
+ #
324
+ # def base64_encode_url(value)
325
+ # Base64.encode64(value).tr('+/', '-_').gsub(/\n/, '')
326
+ # end
327
+ #
328
+ # def signature(payload, secret, algorithm = OpenSSL::Digest::SHA256.new)
329
+ # OpenSSL::HMAC.digest(algorithm, secret, payload)
330
+ # end
331
+ end
332
+
@@ -0,0 +1,38 @@
1
+ # NOTE it would be useful if this lived in omniauth-oauth2 eventually
2
+ shared_examples 'an oauth2 strategy' do
3
+ describe '#client' do
4
+ it 'should be initialized with symbolized client_options' do
5
+ @options = { :client_options => { 'authorize_url' => 'https://example.com' } }
6
+ subject.client.options[:authorize_url].should == 'https://example.com'
7
+ end
8
+ end
9
+
10
+ describe '#authorize_params' do
11
+ it 'should include any authorize params passed in the :authorize_params option' do
12
+ @options = { :authorize_params => { :foo => 'bar', :baz => 'zip' } }
13
+ subject.authorize_params['foo'].should eq('bar')
14
+ subject.authorize_params['baz'].should eq('zip')
15
+ end
16
+
17
+ it 'should include top-level options that are marked as :authorize_options' do
18
+ @options = { :authorize_options => [:scope, :foo], :scope => 'bar', :foo => 'baz' }
19
+ subject.authorize_params['scope'].should eq('bar')
20
+ subject.authorize_params['foo'].should eq('baz')
21
+ end
22
+ end
23
+
24
+ describe '#token_params' do
25
+ it 'should include any authorize params passed in the :authorize_params option' do
26
+ @options = { :token_params => { :foo => 'bar', :baz => 'zip' } }
27
+ subject.token_params['foo'].should eq('bar')
28
+ subject.token_params['baz'].should eq('zip')
29
+ end
30
+
31
+ it 'should include top-level options that are marked as :authorize_options' do
32
+ @options = { :token_options => [:scope, :foo], :scope => 'bar', :foo => 'baz' }
33
+ subject.token_params['scope'].should eq('bar')
34
+ subject.token_params['foo'].should eq('baz')
35
+ end
36
+ end
37
+ end
38
+
@@ -0,0 +1,7 @@
1
+ require 'bundler/setup'
2
+ require 'rspec'
3
+ Dir[File.expand_path('../support/**/*', __FILE__)].each { |f| require f }
4
+
5
+ RSpec.configure do |config|
6
+ end
7
+
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: omniauth-myspace
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - John Ferlito
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: omniauth-oauth
16
+ requirement: &11921880 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *11921880
25
+ - !ruby/object:Gem::Dependency
26
+ name: multi_json
27
+ requirement: &11986000 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *11986000
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec
38
+ requirement: &12020000 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *12020000
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: &12076380 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *12076380
58
+ description: MySpace strategy for omniauth
59
+ email:
60
+ - johnf@inodes.org
61
+ executables: []
62
+ extensions: []
63
+ extra_rdoc_files: []
64
+ files:
65
+ - .gitignore
66
+ - Gemfile
67
+ - LICENSE
68
+ - README.md
69
+ - Rakefile
70
+ - lib/omniauth-myspace.rb
71
+ - lib/omniauth/myspace.rb
72
+ - lib/omniauth/myspace/version.rb
73
+ - lib/omniauth/strategies/myspace.rb
74
+ - omniauth-myspace.gemspec
75
+ - spec/omniauth/strategies/myspace_spec.rb
76
+ - spec/shared_examples.rb
77
+ - spec/spec_helper.rb
78
+ homepage: https://github.com/johnf/omniauth-myspace
79
+ licenses: []
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ segments:
91
+ - 0
92
+ hash: -1586874147567145780
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ segments:
100
+ - 0
101
+ hash: -1586874147567145780
102
+ requirements: []
103
+ rubyforge_project:
104
+ rubygems_version: 1.8.11
105
+ signing_key:
106
+ specification_version: 3
107
+ summary: MySpace strategy for omniauth
108
+ test_files: []