devise_invitable 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- devise_invitable (0.3.0)
4
+ devise_invitable (0.3.1)
5
5
  devise (~> 1.1.0)
6
6
 
7
7
  GEM
data/README.rdoc CHANGED
@@ -2,21 +2,18 @@
2
2
 
3
3
  It adds support to devise[http://github.com/plataformatec/devise] for send invitations by email (it requires to be authenticated) and accept the invitation setting the password.
4
4
 
5
- == Installation
6
-
7
- All gems are on gemcutter, so you need to add gemcutter to your sources if you haven’t yet:
5
+ DeviseInvitable currently only support rails 3, if you want to use it with rails 2.3 you must install version 0.2.3
8
6
 
9
- sudo gem sources -a http://gemcutter.org/
7
+ == Installation
10
8
 
11
9
  Install devise_invitable gem, it should install dependencies (such as devise and warden):
12
10
 
13
11
  sudo gem install devise_invitable
14
12
 
15
- Configure devise_invitable inside your app (and warden and devise if you weren't using them):
13
+ Configure devise_invitable inside your app (and devise if you weren't using them):
16
14
 
17
- config.gem 'warden'
18
- config.gem 'devise'
19
- config.gem 'devise_invitable'
15
+ gem 'devise'
16
+ gem 'devise_invitable'
20
17
 
21
18
  == Basic Usage
22
19
 
@@ -48,6 +45,12 @@ If you are using devise :all, you can add :invitable to config.all in devise ini
48
45
 
49
46
  DeviseInvitable adds a new configuration option, :invite_for. It's the time a invitation is valid for. Default value is nil, which means invitation doesn't expire.
50
47
 
48
+ == Configuring views
49
+
50
+ All of the views are packaged inside the gem. If you'd like to customize the views, invoke the the following generator and it will copy all views to your application:
51
+
52
+ # rails generate devise_invitable:views
53
+
51
54
  == Controller filters
52
55
 
53
56
  It adds authenticate_resource! filter to restrict who can send invitations. You can override this method in your ApplicationController. Default behavior is require authentication of the same resource_name, so if you only have a model with devise it will allow to all authenticated users to send invitations.
@@ -56,19 +59,19 @@ You have to configure mailer as it's required for confirmable and recoverable.
56
59
 
57
60
  == I18n
58
61
 
59
- It uses two flash messages, :send_invitation and :updated, which are translated as other flash messages from devise.
62
+ It uses two flash messages, :send_instructions and :updated, which are translated as other flash messages from devise.
60
63
 
61
64
  == Sending an invitation
62
65
 
63
- To send an invitation to a user use send_invitation class model. You must set email in the attributes hash:
66
+ To invite a user use invite class model. You must set email in the attributes hash:
64
67
 
65
- User.send_invitation(:email => 'new_user@example.com')
68
+ User.invite!(:email => 'new_user@example.com')
66
69
 
67
- To accept an invitation with a token use accept_invitation! class model. You must set invitiation_token attribute, and you can include other attriutes in the hash, which will be updated in the record.
70
+ To accept an invitation with a token use accept_invitation! class model. You must set invitiation_token attribute, and you can include other attributes in the hash, which will be updated in the record.
68
71
 
69
72
  User.accept_invitation!(:invitation_token => params[:invitation_token])
70
73
 
71
- Invitations controller implement this. You can go to /users/invitation/new to send an invitation and an email will be sent with a link to accept in invitiation with a URL like /users/invitation/accept?invitation_token=...
74
+ Invitations controller implement this. You can go to /users/invitation/new to send an invitation and an email will be sent with a link to accept the invitation with a URL like /users/invitation/accept?invitation_token=...
72
75
 
73
76
  == Adding Invitable to a running application
74
77
 
@@ -88,6 +91,14 @@ Add :invitable to the devise line of your model, or to config.all in devise init
88
91
 
89
92
  Override authenticate_resource! filter if you need to customize who can send invitations as it's explained in controller filters section.
90
93
 
94
+ == Contributors
95
+
96
+ Check them all at:
97
+
98
+ http://github.com/scambra/devise_invitable/contributors
99
+
100
+ Special thanks to http://github.com/rymai:"rymai" for rails3 support, his fork was a great help.
101
+
91
102
  == Note on Patches/Pull Requests
92
103
 
93
104
  * Fork the project.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.1
1
+ 0.3.2
@@ -13,11 +13,11 @@ class Devise::InvitationsController < ApplicationController
13
13
 
14
14
  # POST /resource/invitation
15
15
  def create
16
- self.resource = resource_class.send_invitation(params[resource_name])
16
+ self.resource = resource_class.invite!(params[resource_name])
17
17
 
18
18
  if resource.errors.empty?
19
19
  set_flash_message :notice, :send_instructions
20
- redirect_to after_sign_in_path_for(resource_name)
20
+ redirect_to after_update_path_for(resource_name)
21
21
  else
22
22
  render_with_scope :new
23
23
  end
@@ -1,8 +1,8 @@
1
- Hello <%= @resource.email %>!
1
+ <p>Hello <%= @resource.email %>!</p>
2
2
 
3
- Someone has invited you to <%= root_url %>, you can accept it through the link below.
3
+ <p>Someone has invited you to <%= root_url %>, you can accept it through the link below.</p>
4
4
 
5
- <%= link_to 'Accept invitation', accept_invitation_url(@resource, :invitation_token => @resource.invitation_token) %>
5
+ <p><%= link_to 'Accept invitation', accept_invitation_url(@resource, :invitation_token => @resource.invitation_token) %></p>
6
6
 
7
- If you don't want to accept the invitation, please ignore this email.
8
- Your account won't be created until you access the link above and set your password.
7
+ <p>If you don't want to accept the invitation, please ignore this email.<br />
8
+ Your account won't be created until you access the link above and set your password.</p>
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{devise_invitable}
8
- s.version = "0.3.1"
8
+ s.version = "0.3.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Sergio Cambra"]
12
- s.date = %q{2010-09-13}
12
+ s.date = %q{2010-09-15}
13
13
  s.description = %q{It adds support for send invitations by email (it requires to be authenticated) and accept the invitation setting the password}
14
14
  s.email = %q{sergio@entrecables.com}
15
15
  s.extra_rdoc_files = [
@@ -31,7 +31,6 @@ Gem::Specification.new do |s|
31
31
  "app/views/devise/mailer/invitation.html.erb",
32
32
  "config/locales/en.yml",
33
33
  "devise_invitable.gemspec",
34
- "init.rb",
35
34
  "lib/devise_invitable.rb",
36
35
  "lib/devise_invitable/controllers/helpers.rb",
37
36
  "lib/devise_invitable/controllers/url_helpers.rb",
@@ -40,6 +39,7 @@ Gem::Specification.new do |s|
40
39
  "lib/devise_invitable/rails.rb",
41
40
  "lib/devise_invitable/routes.rb",
42
41
  "lib/devise_invitable/schema.rb",
42
+ "lib/generators/devise_invitable/views_generator.rb",
43
43
  "test/integration/invitable_test.rb",
44
44
  "test/integration_tests_helper.rb",
45
45
  "test/mailers/invitation_test.rb",
@@ -13,29 +13,25 @@ module Devise
13
13
  # Examples:
14
14
  #
15
15
  # User.find(1).invited? # true/false
16
- # User.send_invitation(:email => 'someone@example.com') # send invitation
16
+ # User.invite!(:email => 'someone@example.com') # send invitation
17
17
  # User.accept_invitation!(:invitation_token => '...') # accept invitation with a token
18
18
  # User.find(1).accept_invitation! # accept invitation
19
- # User.find(1).resend_invitation! # reset invitation status and send invitation again
19
+ # User.find(1).invite! # reset invitation status and send invitation again
20
20
  module Invitable
21
- def self.included(base)
22
- base.class_eval do
23
- extend ClassMethods
24
- end
25
- end
21
+ extend ActiveSupport::Concern
26
22
 
27
23
  # Accept an invitation by clearing invitation token and confirming it if model
28
24
  # is confirmable
29
25
  def accept_invitation!
30
26
  if self.invited?
31
27
  self.invitation_token = nil
32
- self.save(:validate => false)
28
+ self.save
33
29
  end
34
30
  end
35
31
 
36
32
  # Verifies whether a user has been invited or not
37
33
  def invited?
38
- !new_record? && !invitation_token.nil?
34
+ persisted? && invitation_token.present?
39
35
  end
40
36
 
41
37
  # Send invitation by email
@@ -44,7 +40,7 @@ module Devise
44
40
  end
45
41
 
46
42
  # Reset invitation token and send invitation again
47
- def resend_invitation!
43
+ def invite!
48
44
  if new_record? || invited?
49
45
  self.skip_confirmation! if self.new_record? and self.respond_to? :skip_confirmation!
50
46
  generate_invitation_token
@@ -53,6 +49,11 @@ module Devise
53
49
  end
54
50
  end
55
51
 
52
+ def resend_invitation!
53
+ ActiveSupport::Deprecation.warn('resend_invitation! has been renamed to invite!')
54
+ self.invite!
55
+ end
56
+
56
57
  # Verify whether a invitation is active or not. If the user has been
57
58
  # invited, we need to calculate if the invitation time has not expired
58
59
  # for this user, in other words, if the invitation is still valid.
@@ -96,21 +97,26 @@ module Devise
96
97
  # Attempt to find a user by it's email. If a record is not found, create a new
97
98
  # user and send invitation to it. If user is found, returns the user with an
98
99
  # email already exists error.
99
- # Options must contain the user email
100
- def send_invitation(attributes={})
101
- invitable = find_or_initialize_by_email(attributes[:email])
100
+ # Attributes must contain the user email, other attributes will be set in the record
101
+ def invite!(attributes={})
102
+ invitable = find_or_initialize_with_error_by(:email, attributes.delete(:email))
103
+ invitable.attributes = attributes
102
104
 
103
105
  if invitable.new_record?
104
- invitable.errors.add(:email, :blank) if invitable.email.blank?
105
- invitable.errors.add(:email, :invalid) unless invitable.email.match Devise.email_regexp
106
+ invitable.errors.clear if invitable.email.match Devise.email_regexp
106
107
  else
107
108
  invitable.errors.add(:email, :taken) unless invitable.invited?
108
109
  end
109
110
 
110
- invitable.resend_invitation! if invitable.errors.empty?
111
+ invitable.invite! if invitable.errors.empty?
111
112
  invitable
112
113
  end
113
114
 
115
+ def send_invitation(attributes = {})
116
+ ActiveSupport::Deprecation.warn('send_invitation has been renamed to invite!')
117
+ self.invite!(attributes)
118
+ end
119
+
114
120
  # Attempt to find a user by it's invitation_token to set it's password.
115
121
  # If a user is found, reset it's password and automatically try saving
116
122
  # the record. If not user is found, returns a new user containing an
@@ -121,7 +127,7 @@ module Devise
121
127
  invitable.errors.add(:invitation_token, :invalid) if attributes[:invitation_token] && !invitable.new_record? && !invitable.valid_invitation?
122
128
  if invitable.errors.empty?
123
129
  invitable.attributes = attributes
124
- invitable.accept_invitation! if invitable.valid?
130
+ invitable.accept_invitation!
125
131
  end
126
132
  invitable
127
133
  end
@@ -1,10 +1,8 @@
1
1
  module DeviseInvitable
2
2
  class Engine < ::Rails::Engine
3
3
 
4
- initializer "devise_invitable.add_url_helpers" do |app|
5
- ActionController::Base.send :include, DeviseInvitable::Controllers::UrlHelpers
6
- ActionView::Base.send :include, DeviseInvitable::Controllers::UrlHelpers
7
- end
4
+ ActiveSupport.on_load(:action_controller) { include DeviseInvitable::Controllers::UrlHelpers }
5
+ ActiveSupport.on_load(:action_view) { include DeviseInvitable::Controllers::UrlHelpers }
8
6
 
9
7
  config.after_initialize do
10
8
  Devise::Mailer.send :include, DeviseInvitable::Mailer
@@ -0,0 +1,10 @@
1
+ require 'generators/devise/views_generator'
2
+
3
+ module DeviseInvitable
4
+ module Generators
5
+ class ViewsGenerator < Devise::Generators::ViewsGenerator
6
+ source_root File.expand_path('../../../../app/views', __FILE__)
7
+ desc 'Copies all DeviseInvitable views to your application.'
8
+ end
9
+ end
10
+ end
@@ -15,13 +15,13 @@ class InvitableTest < ActiveSupport::TestCase
15
15
  user = new_user
16
16
  3.times do
17
17
  token = user.invitation_token
18
- user.resend_invitation!
18
+ user.invite!
19
19
  assert_not_equal token, user.invitation_token
20
20
  end
21
21
  end
22
22
 
23
23
  test 'should test invitation sent at with invite_for configuration value' do
24
- user = create_user_with_invitation('')
24
+ user = create_user_with_invitation('token')
25
25
 
26
26
  User.stubs(:invite_for).returns(nil)
27
27
  user.invitation_sent_at = Time.now.utc
@@ -52,7 +52,7 @@ class InvitableTest < ActiveSupport::TestCase
52
52
  invitation_tokens = []
53
53
  3.times do
54
54
  user = new_user
55
- user.resend_invitation!
55
+ user.invite!
56
56
  token = user.invitation_token
57
57
  assert !invitation_tokens.include?(token)
58
58
  invitation_tokens << token
@@ -96,40 +96,56 @@ class InvitableTest < ActiveSupport::TestCase
96
96
  user = new_user
97
97
  assert_difference('ActionMailer::Base.deliveries.size') do
98
98
  token = user.invitation_token
99
- user.resend_invitation!
99
+ user.invite!
100
100
  assert_not_equal token, user.invitation_token
101
101
  end
102
102
  end
103
103
 
104
104
  test 'should return a record with invitation token and no errors to send invitation by email' do
105
- invited_user = User.send_invitation(:email => "valid@email.com")
105
+ invited_user = User.invite!(:email => "valid@email.com")
106
106
  assert invited_user.errors.blank?
107
107
  assert_present invited_user.invitation_token
108
+ assert_equal 'valid@email.com', invited_user.email
109
+ assert invited_user.persisted?
110
+ end
111
+
112
+ test 'should set all attributes with no errors' do
113
+ invited_user = User.invite!(:email => "valid@email.com", :username => 'first name')
114
+ assert invited_user.errors.blank?
115
+ assert_equal 'first name', invited_user.username
116
+ assert invited_user.persisted?
108
117
  end
109
118
 
110
119
  test 'should return a record with errors if user was found by e-mail' do
111
120
  user = create_user_with_invitation('')
112
121
  user.update_attribute(:invitation_token, nil)
113
- invited_user = User.send_invitation(:email => user.email)
122
+ invited_user = User.invite!(:email => user.email)
114
123
  assert_equal invited_user, user
115
124
  assert_equal ['has already been taken'], invited_user.errors[:email]
116
125
  end
117
126
 
118
127
  test 'should return a new record with errors if e-mail is blank' do
119
- invited_user = User.send_invitation(:email => '')
128
+ invited_user = User.invite!(:email => '')
120
129
  assert invited_user.new_record?
121
- assert_equal ["can't be blank", "is invalid"], invited_user.errors[:email]
130
+ assert_equal ["can't be blank"], invited_user.errors[:email]
122
131
  end
123
132
 
124
133
  test 'should return a new record with errors if e-mail is invalid' do
125
- invited_user = User.send_invitation(:email => 'invalid_email')
134
+ invited_user = User.invite!(:email => 'invalid_email')
126
135
  assert invited_user.new_record?
127
136
  assert_equal ["is invalid"], invited_user.errors[:email]
128
137
  end
129
138
 
139
+ test 'should set all attributes with errors if e-mail is invalid' do
140
+ invited_user = User.invite!(:email => "invalid_email.com", :username => 'first name')
141
+ assert invited_user.new_record?
142
+ assert_equal 'first name', invited_user.username
143
+ assert invited_user.errors.present?
144
+ end
145
+
130
146
  test 'should find a user to set his password based on invitation_token' do
131
147
  user = new_user
132
- user.resend_invitation!
148
+ user.invite!
133
149
 
134
150
  invited_user = User.accept_invitation!(:invitation_token => user.invitation_token)
135
151
  assert_equal invited_user, user
@@ -158,7 +174,7 @@ class InvitableTest < ActiveSupport::TestCase
158
174
 
159
175
  test 'should set successfully user password given the new password and confirmation' do
160
176
  user = new_user(:password => nil, :password_confirmation => nil)
161
- user.resend_invitation!
177
+ user.invite!
162
178
 
163
179
  invited_user = User.accept_invitation!(
164
180
  :invitation_token => user.invitation_token,
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise_invitable
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 1
10
- version: 0.3.1
9
+ - 2
10
+ version: 0.3.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Sergio Cambra
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-13 00:00:00 +02:00
18
+ date: 2010-09-15 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -120,7 +120,6 @@ files:
120
120
  - app/views/devise/mailer/invitation.html.erb
121
121
  - config/locales/en.yml
122
122
  - devise_invitable.gemspec
123
- - init.rb
124
123
  - lib/devise_invitable.rb
125
124
  - lib/devise_invitable/controllers/helpers.rb
126
125
  - lib/devise_invitable/controllers/url_helpers.rb
@@ -129,6 +128,7 @@ files:
129
128
  - lib/devise_invitable/rails.rb
130
129
  - lib/devise_invitable/routes.rb
131
130
  - lib/devise_invitable/schema.rb
131
+ - lib/generators/devise_invitable/views_generator.rb
132
132
  - test/integration/invitable_test.rb
133
133
  - test/integration_tests_helper.rb
134
134
  - test/mailers/invitation_test.rb
data/init.rb DELETED
@@ -1 +0,0 @@
1
- require 'devise_invitable'