devise_facebook_connectable 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile ADDED
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+ require 'rubygems'
3
+ require 'rake'
4
+ require 'rake/rdoctask'
5
+
6
+ NAME = "devise_facebook_connectable"
7
+ SUMMARY = %{Devise << Facebook Connect.}
8
+ HOMEPAGE = "http://github.com/grimen/#{NAME}"
9
+ AUTHORS = ["Jonas Grimfelt"]
10
+ EMAIL = "grimen@gmail.com"
11
+ SUPPORT_FILES = %w(README)
12
+
13
+ begin
14
+ gem 'jeweler'
15
+ require 'jeweler'
16
+ Jeweler::Tasks.new do |gemspec|
17
+ gemspec.name = NAME
18
+ gemspec.summary = SUMMARY
19
+ gemspec.description = SUMMARY
20
+ gemspec.homepage = HOMEPAGE
21
+ gemspec.authors = AUTHORS
22
+ gemspec.email = EMAIL
23
+
24
+ gemspec.require_paths = %w{lib}
25
+ gemspec.files = SUPPORT_FILES << %w(Rakefile) <<
26
+ Dir.glob(File.join(*%w[{assets,lib} ** *]).to_s)
27
+ gemspec.extra_rdoc_files = SUPPORT_FILES
28
+
29
+ gemspec.add_dependency 'activesupport', '>= 2.3.0'
30
+ gemspec.add_dependency 'devise', '>= 0.7.0'
31
+ gemspec.add_dependency 'facebooker', '>= 1.0.55'
32
+ end
33
+ Jeweler::GemcutterTasks.new
34
+ rescue LoadError
35
+ puts "Jeweler - or one of its dependencies - is not available. " <<
36
+ "Install it with: sudo gem install jeweler -s http://gemcutter.org"
37
+ end
38
+
39
+ desc %Q{Generate documentation for "#{NAME}".}
40
+ Rake::RDocTask.new(:rdoc) do |rdoc|
41
+ rdoc.rdoc_dir = 'rdoc'
42
+ rdoc.title = NAME
43
+ rdoc.options << '--line-numbers' << '--inline-source' << '--charset=UTF-8'
44
+ rdoc.rdoc_files.include(SUPPORT_FILES)
45
+ rdoc.rdoc_files.include(File.join(*%w[lib ** *.rb]))
46
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+ require 'facebooker'
3
+
4
+ module Devise
5
+ module FacebookConnectable
6
+ module Controllers
7
+ module Filters
8
+
9
+ def self.included(klass)
10
+ klass.class_eval do
11
+ before_filter :set_facebook_session
12
+ helper_method :facebook_session # session[:facebook_session]
13
+ rescue_from ::Facebooker::Session::SessionExpired, :with => :facebook_session_expired
14
+
15
+ # Handle expired Facebook sessions automatically.
16
+ #
17
+ def facebook_session_expired
18
+ clear_fb_cookies!
19
+ clear_facebook_session_information
20
+ redirect_to root_url # TODO: Maybe a bad assumption? Maybe just re-load current page?
21
+ end
22
+ end
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ ActionController::Base.send :include, Devise::FacebookConnectable::Controllers::Filters
@@ -0,0 +1,7 @@
1
+ en:
2
+ devise:
3
+ sessions:
4
+ facebook_invalid: "Could not login. Invalid account."
5
+ facebook_session_expired: "Could not login. Facebook Connect session expired."
6
+ facebook_login: "Connect"
7
+ facebook_logout: "Logout"
@@ -0,0 +1,208 @@
1
+ # encoding: utf-8
2
+ require 'devise_facebook_connectable/strategy'
3
+ require 'devise_facebook_connectable/serializer'
4
+
5
+ module Devise
6
+ module FacebookConnectable
7
+ module Model
8
+ # Facebook Connectable Module, responsible for validating authenticity of a
9
+ # user and storing credentials while signing in using their Facebook account.
10
+ #
11
+ # Configuration:
12
+ #
13
+ # You can overwrite configuration values by setting in globally in Devise (+Devise.setup+),
14
+ # using devise method, or overwriting the respective instance method.
15
+ #
16
+ # facebook_uid_field: Defines the name of the Facebook user UID database attribute/column.
17
+ #
18
+ # facebook_session_key_field: Defines the name of the Facebook session key database attribute/column.
19
+ #
20
+ # facebook_skip_create: Speifies if account should automatically be created upon connect
21
+ # if not already exists.
22
+ #
23
+ # Examples:
24
+ #
25
+ # User.facebook_connect(:uid => '123456789') # returns authenticated user or nil
26
+ # User.find(1).facebook_connected? # returns true/false
27
+ #
28
+ module FacebookConnectable
29
+
30
+ DEFAULT_FACEBOOK_UID_FIELD = :facebook_uid
31
+ DEFAULT_FACEBOOK_SESSION_KEY_FIELD = :facebook_session_key
32
+
33
+ def self.included(base)
34
+ base.class_eval do
35
+ extend ClassMethods
36
+ extend ::Devise::Models::SessionSerializer
37
+
38
+ cattr_accessor :facebook_uid_field, :facebook_session_key_field, :facebook_skip_create
39
+ end
40
+ end
41
+
42
+ # Store Facebook Connect account/session credentials.
43
+ #
44
+ def store_facebook_credentials!(attributes = {})
45
+ # FIXME: Don't work...nil for some reason.
46
+ # self.send(:"#{self.class.facebook_uid_field}=", attributes[:uid])
47
+ # self.send(:"#{self.class.facebook_session_key_field}=", attributes[:session_key])
48
+
49
+ self.send(:"#{DEFAULT_FACEBOOK_UID_FIELD}=", attributes[:uid])
50
+ self.send(:"#{DEFAULT_FACEBOOK_SESSION_KEY_FIELD}=", attributes[:session_key])
51
+
52
+ # Only populate +email+ field if it's available (say, if +authenticable+ module is used).
53
+ self.email = attributes[:email] || '' if self.respond_to?(:email)
54
+
55
+ # Lazy hack: These database fields are required if +authenticable+/+confirmable+
56
+ # module(s) is used.
57
+ self.password_salt = '' if self.respond_to?(:password_salt)
58
+ self.encrypted_password = '' if self.respond_to?(:encrypted_password)
59
+ self.confirmed_at = ::Time.now if self.respond_to?(:confirmed_at)
60
+ end
61
+
62
+ # Checks if Facebook Connect:ed.
63
+ #
64
+ def facebook_connected?
65
+ self.send(:"#{self.class.facebook_uid_field}").present?
66
+ end
67
+ alias :is_facebook_connected? :facebook_connected?
68
+
69
+ # Hook that gets called before connect (each time). Useful for
70
+ # fetching additional user info (etc.) from Facebook.
71
+ #
72
+ # Default: Do nothing.
73
+ #
74
+ # Examples:
75
+ #
76
+ # # Overridden in Facebook Connect:able model, e.g. "User".
77
+ # #
78
+ # def before_facebook_connect(fb_session)
79
+ #
80
+ # # Just fetch what we really need from Facebook...
81
+ # fb_session.user.populate(:locale, :current_location, :username, :name,
82
+ # :first_name, :last_name, :birthday_date, :sex,
83
+ # :city, :state, :country)
84
+ #
85
+ # self.locale = my_fancy_locale_parser(fb_session.user.locale)
86
+ # "Stockholm" => "(GMT+01:00) Stockholm", "Never-Never-land" => "(GMT+00:00) UTC"
87
+ # self.time_zone = fb_session.user.current_location.try(:city)
88
+ # self.country = fb_session.user.current_location.try(:country)
89
+ #
90
+ # self.username = fb_session.user.username
91
+ #
92
+ # self.profile.real_name = fb_session.user.name
93
+ # self.profile.first_name = fb_session.user.first_name
94
+ # self.profile.last_name = fb_session.user.last_name
95
+ # self.profile.birthdate = fb_session.user.birthday_date.try(:to_date)
96
+ # self.profile.gender = my_fancy_gender_parser(fb_session.user.sex)
97
+ #
98
+ # self.profile.city = fb_session.user.hometown_location.try(:city)
99
+ # self.profile.zip_code = fb_session.user.hometown_location.try(:state)
100
+ # self.profile.country = fb_session.user.hometown_location.try(:country)
101
+ #
102
+ # # etc...
103
+ #
104
+ # end
105
+ #
106
+ # For more info:
107
+ # http://facebooker.pjkh.com/user/populate
108
+ #
109
+ def before_facebook_connect(facebook_session)
110
+ # Default: Do nothing.
111
+ end
112
+ alias :before_connect :before_facebook_connect
113
+
114
+ def store_session(using_session_key)
115
+ if self.session_key != using_session_key
116
+ self.update_attribute(:facebook_session_key, using_session_key)
117
+ end
118
+ end
119
+
120
+ # Optional: Recreate Facebook session for this account/user.
121
+ #
122
+ def new_facebook_session
123
+ returning(::Facebooker::Session.create) do |new_session|
124
+ new_session.secure_with!(self.facebook_session_key, self.facebook_uid, 1.hour.from_now)
125
+ ::Facebooker::Session.current = new_session
126
+ end
127
+ end
128
+
129
+ # Optional: See +new_facebook_session+.
130
+ #
131
+ def facebook_session(force = false)
132
+ @facebook_session = self.new_facebook_session if force || @facebook_session.nil?
133
+ @facebook_session
134
+ end
135
+
136
+ module ClassMethods
137
+
138
+ # Alias don't work for some reason, so...a more Ruby-ish alias
139
+ # for +facebook_skip_create+.
140
+ #
141
+ def facebook_skip_create?
142
+ self.facebook_skip_create
143
+ end
144
+
145
+ # Specifies the name of the database column name used for storing
146
+ # the user Facebook UID.
147
+ #
148
+ def facebook_uid_field
149
+ @@facebook_uid_field ||= DEFAULT_FACEBOOK_UID_FIELD
150
+ end
151
+
152
+ # Specifies the name of the database column name used for storing
153
+ # the user Facebook session key.
154
+ #
155
+ def facebook_session_key_field
156
+ @@facebook_session_key_field ||= DEFAULT_FACEBOOK_SESSION_KEY_FIELD
157
+ end
158
+
159
+ # Authenticate using a Facebook UID.
160
+ #
161
+ def facebook_connect(attributes = {})
162
+ if attributes[:uid].present?
163
+ self.find_for_facebook_connect(attributes[:uid])
164
+ end
165
+ end
166
+
167
+ protected
168
+
169
+ # Find first record based on conditions given (Facebook UID).
170
+ # Overwrite to add customized conditions, create a join, or maybe use a
171
+ # namedscope to filter records while authenticating.
172
+ #
173
+ # Example:
174
+ #
175
+ # def self.find_for_facebook_connect(conditions = {})
176
+ # conditions[:active] = true
177
+ # self.find(:first, :conditions => conditions)
178
+ # end
179
+ #
180
+ def find_for_facebook_connect(uid)
181
+ self.find_by_facebook_uid(uid)
182
+ end
183
+
184
+ # Contains the logic used in authentication. Overwritten by other devise modules.
185
+ # In the Facebook Connect case; nothing fancy required.
186
+ #
187
+ def valid_for_facebook_connect(resource, attributes)
188
+ true
189
+ end
190
+
191
+ # Configuration params accessible within +Devise.setup+ procedure (in initalizer).
192
+ #
193
+ ::Devise::Models.config(self,
194
+ :facebook_uid_field,
195
+ :facebook_session_key_field,
196
+ :facebook_skip_create
197
+ )
198
+
199
+ end
200
+
201
+ end
202
+ end
203
+ end
204
+ end
205
+
206
+ Devise::Models.module_eval do
207
+ include ::Devise::FacebookConnectable::Model
208
+ end
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+
3
+ ActionController::Routing::RouteSet::Mapper.class_eval do
4
+
5
+ protected
6
+ # Re-use "authenticatable"-stuff.
7
+ alias :facebook_connectable :authenticatable
8
+
9
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ require 'devise_facebook_connectable/model'
3
+
4
+ module Devise
5
+ module FacebookConnectable
6
+ module Schema
7
+
8
+ # Creates facebook_uid and facebook_session_key (for Facebook Connect authentication/management).
9
+ def facebook_connectable
10
+ # apply_schema ::Devise::Models::FacebookConnectable.facebook_uid_field, Integer, :limit => 8 # BIGINT unsigned / 64-bit int
11
+ apply_schema ::Devise::Models::FacebookConnectable.facebook_uid_field, String
12
+ apply_schema ::Devise::Models::FacebookConnectable.facebook_session_key_field, String
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+
19
+ Devise::Schema.module_eval do
20
+ include ::Devise::FacebookConnectable::Schema
21
+ end
@@ -0,0 +1,3 @@
1
+ # encoding: utf-8
2
+
3
+ Warden::Serializers.add(:facebook_connectable, Devise::Serializers::Authenticatable)
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+
3
+ module Devise
4
+ module Strategies
5
+
6
+ # Default strategy for signing in a user using Facebook Connect (a Facebook account).
7
+ # Redirects to sign_in page if it's not authenticated
8
+ #
9
+ class FacebookConnectable < ::Warden::Strategies::Base
10
+
11
+ include ::Devise::Strategies::Base
12
+
13
+ # Without a Facebook session authentication cannot proceed.
14
+ #
15
+ def valid?
16
+ session[:facebook_session].present?
17
+ end
18
+
19
+ # Authenticate user with Facebook Connect.
20
+ #
21
+ def authenticate!
22
+ klass = mapping.to
23
+ begin
24
+ facebook_session = session[:facebook_session]
25
+ user = klass.facebook_connect(:uid => facebook_session.user.uid)
26
+
27
+ if user.present?
28
+ success!(user)
29
+ else
30
+ if klass.facebook_skip_create?
31
+ fail!(:facebook_invalid)
32
+ else
33
+ user = returning(klass.new) do |u|
34
+ u.store_facebook_credentials!(
35
+ :session_key => facebook_session.session_key,
36
+ :uid => facebook_session.user.uid,
37
+ :email => facebook_session.user.proxied_email
38
+ )
39
+ u.before_connect(facebook_session)
40
+ end
41
+
42
+ begin
43
+ user.save_with_validation(false)
44
+ success!(user)
45
+ rescue
46
+ fail!(:facebook_invalid)
47
+ end
48
+ end
49
+ end
50
+ # Now handled in the controller.
51
+ # rescue ::Facebooker::Session::SessionExpired
52
+ # fail!(:facebook_session_expired)
53
+ end
54
+ end
55
+
56
+ end
57
+ end
58
+ end
59
+
60
+ Warden::Strategies.add(:facebook_connectable, Devise::Strategies::FacebookConnectable)
@@ -0,0 +1,125 @@
1
+ # encoding: utf-8
2
+
3
+ module Devise
4
+ module FacebookConnectable
5
+ module Helpers
6
+
7
+ # References:
8
+ #
9
+ # * http://facebooker.rubyforge.org/
10
+ # * http://wiki.developers.facebook.com/index.php/Connect/Authorization_Websites
11
+ # * http://developers.facebook.com/docs/?u=facebook.jslib.FB.Connect
12
+ #
13
+
14
+ # Known issues:
15
+ #
16
+ # * autologoutlink - There's no onlogout callback - only onlogin, so it's not straightforward
17
+ # to trigger submit on the logout form to destroy the Warden session.
18
+ # Best solution now is either to hook the even manually on click,
19
+ # or use regular link like propsed here:
20
+ #
21
+ # http://forum.developers.facebook.com/viewtopic.php?pid=121283
22
+ #
23
+
24
+ # Make the Facebook Connect strings localized with current locale
25
+ # by default. Just for convenience.
26
+ #
27
+ def localized_fb_connect_javascript_tag(options = {})
28
+ fb_connect_javascript_tag(options.reverse_merge(:lang => ::I18n.locale))
29
+ end
30
+
31
+ # Convenient connect/login/logout method. See below.
32
+ #
33
+ def facebook_link(options = {})
34
+ unless signed_in?(options[:for])
35
+ facebook_login_or_connect_link(options)
36
+ else
37
+ facebook_logout_link(options)
38
+ end
39
+ end
40
+
41
+ # Agnostic Facebook Connect login/connect button/link.
42
+ #
43
+ # Case 1: If Facebook account already connected to the app/site, this is same as
44
+ # a traditional "account login" but with the Facebook dialog unless already
45
+ # logged in to Facebook.
46
+ #
47
+ # Case 2: If account is not connected to the app/site already;
48
+ # then this is the same as a traditional "create account".
49
+ #
50
+ def facebook_login_or_connect_link(options = {})
51
+ resource = options.delete(:for)
52
+ options.reverse_merge!(
53
+ :label => ::I18n.t(:facebook_login, :scope => [:devise, :sessions]),
54
+ :size => :large,
55
+ :length => :long,
56
+ :background => :white,
57
+ :button => true,
58
+ :autologoutlink => false
59
+ )
60
+
61
+ # It seems Devise using :get method for session destroy. Not really RESTful?
62
+ # options.merge!(:method => :delete) if options[:autologoutlink] && signed_in?(options[:for])
63
+
64
+ content_tag(:div, :class => 'fb_connect_login_link') do
65
+ facebook_connect_form(resource, options.slice(:method)) <<
66
+ if options[:button]
67
+ fb_login_button('devise.facebook_connectable.login();', options)
68
+ else
69
+ fb_logout_link(options[:label], 'devise.facebook_connectable.custom_login();')
70
+ end
71
+ end
72
+ end
73
+ alias :facebook_login_link :facebook_login_or_connect_link
74
+ alias :facebook_connect_link :facebook_login_or_connect_link
75
+
76
+ # Agnostic Facebook Connect logout button/link. Logs out the current
77
+ # user from both the app/site and Facebook main site (for security reasons).
78
+ #
79
+ def facebook_logout_link(options = {})
80
+ options.reverse_merge!(
81
+ :label => ::I18n.t(:facebook_logout, :scope => [:devise, :sessions]),
82
+ :size => :large,
83
+ :length => :long,
84
+ :background => :white,
85
+ :button => false
86
+ )
87
+
88
+ content_tag(:div, :class => 'fb_connect_logout_link') do
89
+ facebook_connect_form(options.delete(:for), :logout => true, :method => :get) <<
90
+ if options[:button]
91
+ fb_login_button('devise.facebook_connectable.logout();', options.merge(:autologoutlink => true))
92
+ else
93
+ fb_logout_link(options[:label], destroy_session_path(:user))
94
+ end
95
+ end
96
+ end
97
+
98
+ # TODO: Agnostic Facebook Connect disconnect button/link.
99
+ # Disconnects, i.e. deletes, user account. Identical as "Delete my account",
100
+ # but for Facebook Connect (which "un-installs" the app/site for the current user).
101
+ #
102
+ def facebook_disconnect_link(options = {})
103
+ raise "facebook_disconnect_link: Not implemented yet."
104
+ end
105
+
106
+ protected
107
+
108
+ # Generate agnostic hidden login/logout form for Facebook Connect.
109
+ #
110
+ def facebook_connect_form(for_resource, options = {})
111
+ logout_form = options.delete(:logout) || (options[:method] == :delete)
112
+ options.reverse_merge!(
113
+ :id => (logout_form ? 'fb_connect_logout_form' : 'fb_connect_login_form'),
114
+ :style => 'display:none;'
115
+ )
116
+ resource = ::Devise::Mapping.find_by_path(request.path).to rescue for_resource
117
+ url = logout_form ? destroy_session_path(resource) : session_path(resource)
118
+ form_for(resource, :url => url, :html => options) { |f| }
119
+ end
120
+
121
+ end
122
+ end
123
+ end
124
+
125
+ ::ActionView::Base.send :include, ::Devise::FacebookConnectable::Helpers
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+ begin
3
+ require 'devise'
4
+ rescue
5
+ gem 'devise'
6
+ require 'devise'
7
+ end
8
+
9
+ begin
10
+ require 'facebooker'
11
+ rescue
12
+ gem 'facebooker'
13
+ require 'facebooker'
14
+ end
15
+
16
+ require 'devise_facebook_connectable/model'
17
+ require 'devise_facebook_connectable/serializer'
18
+ require 'devise_facebook_connectable/strategy'
19
+ require 'devise_facebook_connectable/schema'
20
+ require 'devise_facebook_connectable/controller_filters'
21
+ require 'devise_facebook_connectable/routes'
22
+ require 'devise_facebook_connectable/view_helpers'
23
+
24
+ module Devise
25
+ module FacebookConnectable
26
+
27
+ extend self
28
+
29
+ mattr_accessor :verbose
30
+
31
+ # Logging helper: Internal debug-logging for the plugin.
32
+ #
33
+ def log(message, level = :info)
34
+ return unless @@verbose
35
+ level = :info if level.blank?
36
+ @@logger ||= ::Logger.new(::STDOUT)
37
+ @@logger.send(level.to_sym, "[devise/facebook_connectable:] #{level.to_s.upcase} #{message}")
38
+ end
39
+
40
+ end
41
+ end
42
+
43
+ # Ugly hack, but needed now.
44
+ #
45
+ Devise::STRATEGIES.unshift :facebook_connectable
46
+ Devise::SERIALIZERS.unshift :facebook_connectable
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: devise_facebook_connectable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jonas Grimfelt
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-12-08 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activesupport
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.3.0
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: devise
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.7.0
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: facebooker
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 1.0.55
44
+ version:
45
+ description: Devise << Facebook Connect.
46
+ email: grimen@gmail.com
47
+ executables: []
48
+
49
+ extensions: []
50
+
51
+ extra_rdoc_files:
52
+ - Rakefile
53
+ - lib/devise_facebook_connectable.rb
54
+ - lib/devise_facebook_connectable/controller_filters.rb
55
+ - lib/devise_facebook_connectable/locales/en.yml
56
+ - lib/devise_facebook_connectable/model.rb
57
+ - lib/devise_facebook_connectable/routes.rb
58
+ - lib/devise_facebook_connectable/schema.rb
59
+ - lib/devise_facebook_connectable/serializer.rb
60
+ - lib/devise_facebook_connectable/strategy.rb
61
+ - lib/devise_facebook_connectable/view_helpers.rb
62
+ files:
63
+ - Rakefile
64
+ - lib/devise_facebook_connectable.rb
65
+ - lib/devise_facebook_connectable/controller_filters.rb
66
+ - lib/devise_facebook_connectable/locales/en.yml
67
+ - lib/devise_facebook_connectable/model.rb
68
+ - lib/devise_facebook_connectable/routes.rb
69
+ - lib/devise_facebook_connectable/schema.rb
70
+ - lib/devise_facebook_connectable/serializer.rb
71
+ - lib/devise_facebook_connectable/strategy.rb
72
+ - lib/devise_facebook_connectable/view_helpers.rb
73
+ has_rdoc: true
74
+ homepage: http://github.com/grimen/devise_facebook_connectable
75
+ licenses: []
76
+
77
+ post_install_message:
78
+ rdoc_options:
79
+ - --charset=UTF-8
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: "0"
87
+ version:
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: "0"
93
+ version:
94
+ requirements: []
95
+
96
+ rubyforge_project:
97
+ rubygems_version: 1.3.5
98
+ signing_key:
99
+ specification_version: 3
100
+ summary: Devise << Facebook Connect.
101
+ test_files: []
102
+