devise-twitter-amuino 0.1.2.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
4
+ .rvmrc
5
+ session.vim
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source :gemcutter
2
+
3
+ # Specify your gem's dependencies in devise-twitter.gemspec
4
+ gemspec
@@ -0,0 +1,40 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ devise-twitter (0.1.1)
5
+ devise (>= 1.1.0)
6
+ warden_oauth (~> 0.1.1)
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ bcrypt-ruby (2.1.2)
12
+ devise (1.1.2)
13
+ bcrypt-ruby (~> 2.1.2)
14
+ warden (~> 0.10.7)
15
+ diff-lcs (1.1.2)
16
+ oauth (0.4.3)
17
+ rack (1.2.1)
18
+ rspec (2.0.0.beta.20)
19
+ rspec-core (= 2.0.0.beta.20)
20
+ rspec-expectations (= 2.0.0.beta.20)
21
+ rspec-mocks (= 2.0.0.beta.20)
22
+ rspec-core (2.0.0.beta.20)
23
+ rspec-expectations (2.0.0.beta.20)
24
+ diff-lcs (>= 1.1.2)
25
+ rspec-mocks (2.0.0.beta.20)
26
+ warden (0.10.7)
27
+ rack (>= 1.0.0)
28
+ warden_oauth (0.1.1)
29
+ oauth
30
+ warden (>= 0.8.1)
31
+
32
+ PLATFORMS
33
+ ruby
34
+
35
+ DEPENDENCIES
36
+ bundler (>= 1.0.0)
37
+ devise (>= 1.1.0)
38
+ devise-twitter!
39
+ rspec (~> 2.0.0.beta)
40
+ warden_oauth (~> 0.1.1)
@@ -0,0 +1,21 @@
1
+ Copyright 2010 Martin Schuerrer. http://www.schuerrer.org
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
@@ -0,0 +1,147 @@
1
+ devise-twitter
2
+ ==========
3
+
4
+ Devise-twitter adds **Sign in via Twitter** and **Connect your account to
5
+ Twitter** functionality to your [devise][1] app.
6
+
7
+ It requires at least Devise 1.1 and ONLY works with Rails 3.
8
+
9
+ Current status
10
+ --------------
11
+
12
+ Devise-twitter currently supports *Sign in via Twitter* and *Connect your
13
+ account to Twitter*, but no proper API for *Connect your account to Twitter*
14
+ exists so far.
15
+
16
+ This plugin is in use in an upcoming product and continues to be improved.
17
+
18
+ Installation
19
+ ------------
20
+
21
+ Simply add devise-twitter to your Gemfile and bundle it up:
22
+
23
+ gem 'devise-twitter-amuino', :require => 'devise-twitter'
24
+
25
+ Run the generator, supplying the name of the model (e.g. User)
26
+
27
+ $ rails generate devise:twitter user
28
+
29
+ Add your OAuth credentials to `config/initializers/devise_twitter.rb`
30
+
31
+ Devise::Twitter.setup do |config|
32
+ config.consumer_key = <YOUR CONSUMER KEY HERE>
33
+ config.consumer_secret = <YOUR CONSUMER SECRET HERE>
34
+ config.scope = :user
35
+ end
36
+
37
+ Modify your user model like so
38
+
39
+ class User < ActiveRecord::Base
40
+ # To use devise-twitter don't forget to include the :twitter_oauth module:
41
+ # e.g. devise :database_authenticatable, ... , :twitter_oauth
42
+
43
+ # IMPORTANT: If you want to support sign in via twitter you MUST remove the
44
+ # :validatable module, otherwise the user will never be saved
45
+ # since it's email and password is blank.
46
+ # :validatable checks only email and password so it's safe to remove
47
+
48
+ # Include default devise modules. Others available are:
49
+ # :token_authenticatable, :confirmable, :lockable and :timeoutable
50
+ devise :database_authenticatable, :registerable,
51
+ :recoverable, :rememberable, :trackable :twitter_oauth
52
+
53
+ # Setup accessible (or protected) attributes for your model
54
+ attr_accessible :email, :password, :password_confirmation, :remember_me
55
+ end
56
+
57
+
58
+ Modify the generated routes (in `config/routes.rb`) to your liking
59
+
60
+ Application.routes.draw do
61
+ devise_for :user do
62
+ match '/user/sign_in/twitter' => Devise::Twitter::Rack::Signin
63
+ match '/user/connect/twitter' => Devise::Twitter::Rack::Connect
64
+ end
65
+ ...
66
+
67
+ Run the generated migration
68
+
69
+ $ rake db:migrate
70
+
71
+
72
+
73
+ Signing in via Twitter
74
+ ----------------------
75
+
76
+ When signing in via Twitter, after authorizing access on www.twitter.com,
77
+ devise-twitter will sign in an existing user or create a new one, if no user
78
+ with the same twitter id exists.
79
+
80
+
81
+ Connect your account to Twitter
82
+ -------------------------------
83
+
84
+ Devise-twitter supports adding Twitter credentials to an existing user account
85
+ (e.g. one that registered via email/password) but currently the API to expose
86
+ this feature is far from perfect:
87
+
88
+ After navigating to `/user/connect/twitter` and authorizing access on
89
+ www.twitter.com, devise-twitter checks if there is another user with the same
90
+ twitter id. If not devise-twitter adds twitter handle and oauth credentials
91
+ to the current user and saves.
92
+
93
+ If another user with the same twitter id is found devise-twitter sets the
94
+ session variable `warden.user.twitter.connected_user.key` to the id of this
95
+ user. Your application can check if this variable is set and display an option
96
+ to merge the two users.
97
+
98
+ if connected_user = session['warden.user.twitter.connected_user.key'].present?
99
+ connected_user = User.find(connected_user)
100
+
101
+ # Ask user if she/he wants to merge her/his accounts
102
+ # (or just go ahead and merge them)
103
+ end
104
+
105
+ If you have any idea how to improve it, please message me.
106
+
107
+ Database changes
108
+ ----------------
109
+
110
+ The generated migration adds three fields to your user model:
111
+
112
+ change_table(:users) do |t|
113
+ t.column :twitter_id, :integer
114
+ t.column :twitter_handle, :string
115
+ t.column :twitter_oauth_token, :string
116
+ t.column :twitter_oauth_secret, :string
117
+ end
118
+
119
+ add_index :users, :twitter_id, :unique => true
120
+ add_index :users, :twitter_handle, :unique => true
121
+ add_index :users, [:twitter_oauth_token, :twitter_oauth_secret]
122
+
123
+ Currently the names of these fields are hard coded, but making them
124
+ customizable is on the roadmap.
125
+
126
+
127
+
128
+ Acknowledgements
129
+ ----------------
130
+
131
+ Thanks to
132
+
133
+ * [Daniel Neighman](http://twitter.com/hassox) for creating warden, the framework Devise uses
134
+ * [Jose Valim](http://twitter.com/josevalim) for creating Devise
135
+ * [Pelle Braendgaard](http://stakeventures.com/pages/whoami) for implementing oauth support in Ruby
136
+ * [Roman Gonzalez](http://www.romanandreg.com/) for creating warden_oauth, the framework devise-twitter uses
137
+ * all the other giants who's shoulders this project stands on
138
+
139
+
140
+ Meta
141
+ ----
142
+
143
+ * Code: `git clone http://github.com/MSch/devise-twitter`
144
+ * Bugs: <http://github.com/MSch/devise-twitter/issues>
145
+ * Gems: <http://rubygems.org/gems/devise-twitter>
146
+
147
+ [1]:http://github.com/plataformatec/devise
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path("../lib/devise/twitter/version", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "devise-twitter-amuino"
6
+ s.version = Devise::Twitter::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ['Martin Schuerrer', "Abel Muiño"]
9
+ s.email = ['martin@schuerrer.org', 'amuino@abelmuino.com']
10
+ s.homepage = "http://github.com/amuino/devise-twitter"
11
+ s.summary = "Sign in via Twitter and Connect your account to Twitter functionality for your Devise/Rails app"
12
+ s.description = "Sign in via Twitter and Connect your account to Twitter functionality for your Devise/Rails app"
13
+
14
+ s.required_rubygems_version = ">= 1.3.6"
15
+ s.rubyforge_project = "devise-twitter"
16
+
17
+ # FIXME: Seems like bundler can't handle [">= 1.1.0", "< 1.3.0"]
18
+ s.add_dependency "devise", ">= 1.1.0"
19
+ s.add_dependency "warden_oauth", "~> 0.1.1"
20
+ s.add_development_dependency "bundler", ">= 1.0.0"
21
+ s.add_development_dependency "rspec", "~> 2.0.0.beta"
22
+
23
+ s.files = `git ls-files`.split("\n")
24
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
25
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
26
+ s.require_paths = ["lib"]
27
+ end
@@ -0,0 +1,14 @@
1
+ module Devise
2
+ module Twitter
3
+ end
4
+ end
5
+
6
+ require "rack"
7
+ require "warden"
8
+ require "oauth"
9
+ require "warden_oauth"
10
+ require "devise"
11
+ require "devise/twitter"
12
+ require "devise/twitter/rack"
13
+ require "devise/twitter/warden"
14
+ require "devise/twitter/version"
@@ -0,0 +1,39 @@
1
+ module Devise
2
+ module Twitter
3
+ @@setup_done = false
4
+
5
+ mattr_accessor :consumer_key
6
+ @@consumer_key = nil
7
+
8
+ # Private methods to interface with Warden.
9
+ mattr_accessor :consumer_secret
10
+ @@consumer_secret = nil
11
+
12
+ mattr_accessor :scope
13
+ @@scope = nil
14
+
15
+ # Default way to setup Devise. Run rails generate devise_install to create
16
+ # a fresh initializer with all configuration values.
17
+ def self.setup
18
+ raise "Can not invoke setup twice" if @@setup_done
19
+ yield self
20
+ @@setup_done = true
21
+
22
+ Devise.warden do |manager|
23
+ manager.oauth(:twitter) do |twitter|
24
+ twitter.consumer_key = @@consumer_key
25
+ twitter.consumer_secret = @@consumer_secret
26
+ twitter.options = {
27
+ :site => "https://api.twitter.com",
28
+ :request_token_path => "/oauth/request_token",
29
+ :access_token_path => "/oauth/access_token",
30
+ :authorize_path => "/oauth/authenticate",
31
+ :realm => "http://api.twitter.com/"
32
+ }
33
+ end
34
+ manager.default_strategies(:scope => @@scope).unshift :twitter_oauth
35
+ end
36
+ end
37
+ end
38
+ end
39
+
@@ -0,0 +1,64 @@
1
+ module Devise
2
+ module Twitter
3
+ module Rack
4
+ Signin = proc do |env|
5
+ warden = env['warden']
6
+ session = env['rack.session']
7
+ request = ::Rack::Request.new(env)
8
+ scope = env["devise.mapping"].singular
9
+
10
+ if request.params.include?('oauth_token')
11
+ # We got a redirect from Twitter back
12
+
13
+ # Perform _only_ the twitter_oauth strategy.
14
+ # Emulate _perform_authentication in _warden/proxy.rb
15
+ strategy = warden.send(:_fetch_strategy, :twitter_oauth, scope)
16
+ strategy.authenticate!
17
+ if strategy.user
18
+ warden.set_user(strategy.user, :event => :authentication, :scope => scope)
19
+ end
20
+
21
+ redirect_to Warden::OAuth::Utils.host_with_port(request)
22
+ else
23
+ # Perform the redirect to Twitter
24
+ strategy = warden.send(:_fetch_strategy, :twitter_oauth, scope)
25
+
26
+ # warden_oauth would always redirect to / so we need to hook into it
27
+ request_token = strategy.consumer.get_request_token(:oauth_callback => request.url)
28
+ strategy.instance_variable_set(:@request_token, request_token)
29
+
30
+ # warden_oauth does exactly this if params.include? warden_oauth_provider
31
+ # which we also hack around
32
+ strategy.send(:store_request_token_on_session)
33
+ redirect_to request_token.authorize_url
34
+ end
35
+ end
36
+
37
+ Connect = proc do |env|
38
+ # Check that user exists in DB, otherwise we'll get 'user with access token not found'
39
+ # But since connecting to twitter only makes sense for existing users that's ok
40
+ # TODO: If our user is unobtrusive redirect_to :back
41
+ scope = env["devise.mapping"].singular
42
+ env["warden.#{scope}.twitter.perform_connect"] = true
43
+
44
+ Signin.call(env)
45
+ end
46
+
47
+ private
48
+
49
+ # Stolen from action_dispatch/routing/mapper.rb
50
+ def self.redirect_to(url)
51
+ status = 302 # Found
52
+ body = %(<html><body>You are being <a href="#{ERB::Util.h(url.to_s)}">redirected</a>.</body></html>)
53
+
54
+ headers = {
55
+ 'Location' => url.to_s,
56
+ 'Content-Type' => 'text/html',
57
+ 'Content-Length' => body.length.to_s
58
+ }
59
+
60
+ [ status, headers, [body] ]
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,5 @@
1
+ module Devise
2
+ module Twitter
3
+ VERSION = "0.1.2.pre1"
4
+ end
5
+ end
@@ -0,0 +1,59 @@
1
+ Warden::OAuth.access_token_user_finder(:twitter) do |access_token|
2
+ perform_connect = (env["warden.#{@scope}.twitter.perform_connect"] == true)
3
+ twitter_handle = access_token.params[:screen_name]
4
+ twitter_id = access_token.params[:user_id]
5
+ klass = @env['devise.mapping'].class_name.constantize
6
+
7
+ if perform_connect
8
+ # Add twitter_handle to current user
9
+ already_existing_user = klass.where(:twitter_id => twitter_id).first
10
+ if already_existing_user.blank?
11
+ # We don't know anyone with this handle, therefore continue with connecting
12
+ user = @env['warden'].user
13
+ user.twitter_handle = twitter_handle if User.column_names.include? "twitter_handle"
14
+ user.twitter_id = twitter_id
15
+ user.twitter_oauth_token = access_token.token
16
+ user.twitter_oauth_secret = access_token.secret
17
+ user.save
18
+ return user
19
+ else
20
+ # We already have such a user in our DB
21
+ # We might need to update the twitter_handle if the user has changed it
22
+ if User.column_names.include?("twitter_handle") && twitter_handle != user.twitter_handle
23
+ user.twitter_handle = twitter_handle
24
+ user.save
25
+ end
26
+ session["warden.#{@scope}.twitter.connected_user.key"] = already_existing_user.id
27
+ return @env['warden'].user
28
+ end
29
+ else
30
+ previous_user = @env['warden'].user
31
+
32
+ # Try to find user
33
+ user = klass.where(:twitter_id => twitter_id).first if user.nil?
34
+
35
+ # Since we are logging in a new user we want to make sure the before_logout hook is called
36
+ @env['warden'].logout if previous_user.present?
37
+
38
+ if user.nil?
39
+ # Create user if we don't know him yet
40
+ user = klass.new
41
+ user.twitter_handle = twitter_handle if User.column_names.include? "twitter_handle"
42
+ user.twitter_id = twitter_id
43
+ user.twitter_oauth_token = access_token.token
44
+ user.twitter_oauth_secret = access_token.secret
45
+ user.save
46
+ else
47
+ # We might need to update the twitter_handle if the user has changed it
48
+ if User.column_names.include?("twitter_handle") && twitter_handle != user.twitter_handle
49
+ user.twitter_handle = twitter_handle
50
+ end
51
+ # We also might need to update the oauth tokens
52
+ user.twitter_oauth_token = access_token.token if user.twitter_oauth_token != access_token.token
53
+ user.twitter_oauth_secret = access_token.secret if user.twitter_oauth_secret != access_token.secret
54
+ user.save if user.changed?
55
+ end
56
+
57
+ return user
58
+ end
59
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Generates for the model with the given NAME a migration file and devise-twitter routes.
3
+
4
+ Example:
5
+ rails generate devise:twitter User
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1 @@
1
+ What you need to do now
@@ -0,0 +1,6 @@
1
+ Devise::Twitter.setup do |config|
2
+ config.consumer_key = <YOUR CONSUMER KEY>
3
+ config.consumer_secret = <YOUR CONSUMER SECRET>
4
+ config.scope = :<%= singular_name %>
5
+ end
6
+
@@ -0,0 +1,27 @@
1
+ class AddDeviseTwitterFieldsTo<%= table_name.camelize %> < ActiveRecord::Migration
2
+ def self.up
3
+ change_table(:<%= table_name %>) do |t|
4
+ t.column :twitter_handle, :string #optional
5
+ t.column :twitter_id, :integer
6
+ t.column :twitter_oauth_token, :string
7
+ t.column :twitter_oauth_secret, :string
8
+ end
9
+
10
+ add_index :<%= table_name %>, :twitter_handle, :unique => true #optional
11
+ add_index :<%= table_name %>, :twitter_id, :unique => true
12
+ add_index :<%= table_name %>, [:twitter_oauth_token, :twitter_oauth_secret]
13
+ end
14
+
15
+ def self.down
16
+ remove_index :<%= table_name %>, :column => :twitter_handle
17
+ remove_index :<%= table_name %>, :column => :twitter_id
18
+ remove_index :<%= table_name %>, :column => [:twitter_oauth_token, :twitter_oauth_secret]
19
+
20
+ change_table(:<%= table_name %>) do |t|
21
+ t.remove :twitter_handle
22
+ t.remove :twitter_id
23
+ t.remove :twitter_oauth_token
24
+ t.remove :twitter_oauth_secret
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,47 @@
1
+ require 'rails/generators/active_record'
2
+
3
+ module Devise
4
+ module Generators
5
+ class TwitterGenerator < ActiveRecord::Generators::Base
6
+ source_root File.expand_path('../templates', __FILE__)
7
+ def add_migration
8
+ migration_template "migration.rb", "db/migrate/add_devise_twitter_fields_to_#{table_name}"
9
+ end
10
+
11
+ def inject_devise_twitter_intomodel
12
+ inject_into_class model_path, class_name, <<-CONTENT
13
+ # To use devise-twitter don't forget to include the :twitter_oauth module:
14
+ # e.g. devise :database_authenticatable, ... , :twitter_oauth
15
+
16
+ # IMPORTANT: If you want to support sign in via twitter you MUST remove the
17
+ # :validatable module, otherwise the user will never be saved
18
+ # since it's email and password is blank.
19
+ # :validatable checks only email and password so it's safe to remove
20
+
21
+ CONTENT
22
+ end
23
+
24
+ def copy_initializer
25
+ template "initializer.rb", "config/initializers/devise_twitter.rb"
26
+ end
27
+
28
+ def add_devise_twitter_routes
29
+ route <<-CONTENT
30
+ devise_for :#{singular_name} do
31
+ match '/#{singular_name}/sign_in/twitter' => Devise::Twitter::Rack::Signin
32
+ match '/#{singular_name}/connect/twitter' => Devise::Twitter::Rack::Connect
33
+ end
34
+ CONTENT
35
+ end
36
+
37
+ def show_readme
38
+ readme "README" if behavior == :invoke
39
+ end
40
+
41
+ private
42
+ def model_path
43
+ @model_path ||= File.join("app", "models", "#{file_path}.rb")
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,17 @@
1
+ require 'rspec'
2
+
3
+ # Requires supporting files with custom matchers and macros, etc,
4
+ # in ./support/ and its subdirectories.
5
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
6
+
7
+ RSpec.configure do |config|
8
+ # == Mock Framework
9
+ #
10
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
11
+ #
12
+ # config.mock_with :mocha
13
+ # config.mock_with :flexmock
14
+ # config.mock_with :rr
15
+ config.mock_with :rspec
16
+ end
17
+
metadata ADDED
@@ -0,0 +1,154 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: devise-twitter-amuino
3
+ version: !ruby/object:Gem::Version
4
+ hash: -1876988192
5
+ prerelease: true
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 2
10
+ - pre1
11
+ version: 0.1.2.pre1
12
+ platform: ruby
13
+ authors:
14
+ - Martin Schuerrer
15
+ - "Abel Mui\xC3\xB1o"
16
+ autorequire:
17
+ bindir: bin
18
+ cert_chain: []
19
+
20
+ date: 2010-10-11 00:00:00 +02:00
21
+ default_executable:
22
+ dependencies:
23
+ - !ruby/object:Gem::Dependency
24
+ name: devise
25
+ prerelease: false
26
+ requirement: &id001 !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ hash: 19
32
+ segments:
33
+ - 1
34
+ - 1
35
+ - 0
36
+ version: 1.1.0
37
+ type: :runtime
38
+ version_requirements: *id001
39
+ - !ruby/object:Gem::Dependency
40
+ name: warden_oauth
41
+ prerelease: false
42
+ requirement: &id002 !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ hash: 25
48
+ segments:
49
+ - 0
50
+ - 1
51
+ - 1
52
+ version: 0.1.1
53
+ type: :runtime
54
+ version_requirements: *id002
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ prerelease: false
58
+ requirement: &id003 !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ hash: 23
64
+ segments:
65
+ - 1
66
+ - 0
67
+ - 0
68
+ version: 1.0.0
69
+ type: :development
70
+ version_requirements: *id003
71
+ - !ruby/object:Gem::Dependency
72
+ name: rspec
73
+ prerelease: false
74
+ requirement: &id004 !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ~>
78
+ - !ruby/object:Gem::Version
79
+ hash: 31098209
80
+ segments:
81
+ - 2
82
+ - 0
83
+ - 0
84
+ - beta
85
+ version: 2.0.0.beta
86
+ type: :development
87
+ version_requirements: *id004
88
+ description: Sign in via Twitter and Connect your account to Twitter functionality for your Devise/Rails app
89
+ email:
90
+ - martin@schuerrer.org
91
+ - amuino@abelmuino.com
92
+ executables: []
93
+
94
+ extensions: []
95
+
96
+ extra_rdoc_files: []
97
+
98
+ files:
99
+ - .gitignore
100
+ - Gemfile
101
+ - Gemfile.lock
102
+ - MIT-LICENSE
103
+ - README.md
104
+ - Rakefile
105
+ - devise-twitter.gemspec
106
+ - lib/devise-twitter.rb
107
+ - lib/devise/twitter.rb
108
+ - lib/devise/twitter/rack.rb
109
+ - lib/devise/twitter/version.rb
110
+ - lib/devise/twitter/warden.rb
111
+ - lib/generators/devise/USAGE
112
+ - lib/generators/devise/templates/README
113
+ - lib/generators/devise/templates/initializer.rb
114
+ - lib/generators/devise/templates/migration.rb
115
+ - lib/generators/devise/twitter_generator.rb
116
+ - spec/spec_helper.rb
117
+ has_rdoc: true
118
+ homepage: http://github.com/amuino/devise-twitter
119
+ licenses: []
120
+
121
+ post_install_message:
122
+ rdoc_options: []
123
+
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ hash: 3
132
+ segments:
133
+ - 0
134
+ version: "0"
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ none: false
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ hash: 23
141
+ segments:
142
+ - 1
143
+ - 3
144
+ - 6
145
+ version: 1.3.6
146
+ requirements: []
147
+
148
+ rubyforge_project: devise-twitter
149
+ rubygems_version: 1.3.7
150
+ signing_key:
151
+ specification_version: 3
152
+ summary: Sign in via Twitter and Connect your account to Twitter functionality for your Devise/Rails app
153
+ test_files:
154
+ - spec/spec_helper.rb