devise_invitable 2.0.14 → 3.0.1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +66 -0
- data/README.md +166 -97
- data/app/controllers/devise/invitations_controller.rb +8 -2
- data/app/controllers/devise_invitable/registrations_controller.rb +15 -10
- data/lib/devise_invitable/invitation.rb +89 -0
- data/lib/devise_invitable/inviter.rb +23 -1
- data/lib/devise_invitable/migrator.rb +113 -0
- data/lib/devise_invitable/models.rb +353 -86
- data/lib/devise_invitable/rails.rb +10 -0
- data/lib/devise_invitable/version.rb +1 -1
- data/lib/devise_invitable.rb +40 -4
- data/lib/generators/active_record/devise_invitable_install_generator.rb +22 -0
- data/lib/generators/active_record/devise_invitable_upgrade_generator.rb +28 -0
- data/lib/generators/active_record/templates/create_devise_invitations.rb +23 -0
- data/lib/generators/active_record/templates/upgrade_devise_invitations.rb +72 -0
- data/lib/generators/devise_invitable/devise_invitable_generator.rb +2 -4
- data/lib/generators/devise_invitable/install_generator.rb +8 -10
- data/lib/generators/devise_invitable/upgrade_generator.rb +16 -0
- data/lib/generators/mongoid/devise_invitable_install_generator.rb +7 -0
- data/lib/generators/mongoid/devise_invitable_upgrade_generator.rb +11 -0
- data/lib/tasks/devise_invitable_tasks.rake +10 -0
- data/test/functional/registrations_controller_test.rb +24 -3
- data/test/generators_test.rb +16 -9
- data/test/integration/invitation_test.rb +24 -3
- data/test/mailers/invitation_mail_test.rb +1 -0
- data/test/models/invitable_test.rb +40 -2
- data/test/models/separate_invitations_test.rb +181 -0
- data/test/models_test.rb +34 -0
- data/test/rails_app/app/controllers/boolean_inviter_invitations_controller.rb +11 -0
- data/test/rails_app/app/controllers/restricted_invitations_controller.rb +9 -0
- data/test/rails_app/app/models/user.rb +8 -2
- data/test/rails_app/config/initializers/devise.rb +0 -9
- data/test/rails_app/config/routes.rb +2 -0
- data/test/rails_app/db/migrate/20100401102949_create_tables.rb +22 -0
- data/test/routes_test.rb +6 -0
- metadata +26 -13
- data/lib/generators/active_record/devise_invitable_generator.rb +0 -19
- data/lib/generators/active_record/templates/migration.rb +0 -22
- data/lib/generators/mongoid/devise_invitable_generator.rb +0 -8
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
require 'model_tests_helper'
|
|
3
|
+
|
|
4
|
+
class SeparateInvitationsTest < ActiveSupport::TestCase
|
|
5
|
+
setup do
|
|
6
|
+
@create_resource_on_invitation = User.create_resource_on_invitation
|
|
7
|
+
DeviseInvitable::Invitation.delete_all
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
teardown do
|
|
11
|
+
User.create_resource_on_invitation = @create_resource_on_invitation
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
test 'an invitation can be persisted without creating a resource' do
|
|
15
|
+
User.create_resource_on_invitation = false
|
|
16
|
+
registered = User.create!(email: 'registered@example.com', password: '123456789')
|
|
17
|
+
|
|
18
|
+
invited = User.invite!(email: 'deferred@example.com')
|
|
19
|
+
invitation = DeviseInvitable::Invitation.first
|
|
20
|
+
|
|
21
|
+
assert_predicate invited, :new_record?
|
|
22
|
+
assert_equal 0, User.where(email: 'deferred@example.com').count
|
|
23
|
+
assert_equal({ 'email' => 'deferred@example.com' }, invitation.invite_key.to_h.stringify_keys)
|
|
24
|
+
assert_nil invitation.invitable_id
|
|
25
|
+
assert_nil invitation.resource_created_at
|
|
26
|
+
assert_includes User.no_active_invitation, registered
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
test 'accepting one of multiple invitations creates the resource and supersedes the others' do
|
|
30
|
+
User.create_resource_on_invitation = false
|
|
31
|
+
first_inviter = User.create!(email: 'first@example.com', password: '123456789')
|
|
32
|
+
second_inviter = User.create!(email: 'second@example.com', password: '123456789')
|
|
33
|
+
|
|
34
|
+
User.invite!({ email: 'multiple@example.com' }, first_inviter)
|
|
35
|
+
first = DeviseInvitable::Invitation.order(id: :asc).first
|
|
36
|
+
User.invite!({ email: 'multiple@example.com' }, second_inviter)
|
|
37
|
+
accepted_token = Thread.current[:token]
|
|
38
|
+
|
|
39
|
+
user = User.accept_invitation!(
|
|
40
|
+
invitation_token: accepted_token,
|
|
41
|
+
password: '123456789',
|
|
42
|
+
password_confirmation: '123456789'
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
assert_predicate user, :persisted?
|
|
46
|
+
refute_predicate user, :invitation_pending?
|
|
47
|
+
assert DeviseInvitable::Invitation.accepted.where(invitable: user).exists?
|
|
48
|
+
assert_equal 'accepted_other_invitation', first.reload.superseded_reason
|
|
49
|
+
assert_equal first_inviter, first.invited_by
|
|
50
|
+
assert_equal second_inviter, DeviseInvitable::Invitation.accepted.find_by!(invitable: user).invited_by
|
|
51
|
+
assert_equal user, first.invitable
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
test 'resending stages the new inviter without changing the previous invitation' do
|
|
55
|
+
User.create_resource_on_invitation = true
|
|
56
|
+
first_inviter = User.create!(email: 'first@example.com', password: '123456789')
|
|
57
|
+
second_inviter = User.create!(email: 'second@example.com', password: '123456789')
|
|
58
|
+
|
|
59
|
+
User.invite!({ email: 'multiple@example.com' }, first_inviter)
|
|
60
|
+
first_invitation = DeviseInvitable::Invitation.order(id: :asc).first
|
|
61
|
+
|
|
62
|
+
User.invite!({ email: 'multiple@example.com' }, second_inviter) do |invitable|
|
|
63
|
+
assert_equal second_inviter, invitable.invited_by
|
|
64
|
+
assert_equal second_inviter, invitable.invited_by_for_next_invitation
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
assert_equal first_inviter, first_invitation.reload.invited_by
|
|
68
|
+
assert_equal second_inviter, DeviseInvitable::Invitation.order(id: :asc).last.invited_by
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
test 'an inviter exposes its sent invitations' do
|
|
72
|
+
inviter = Admin.create!(email: 'admin@example.com', password: '123456789')
|
|
73
|
+
|
|
74
|
+
User.invite!({ email: 'invited@example.com' }, inviter)
|
|
75
|
+
|
|
76
|
+
assert_equal [DeviseInvitable::Invitation.last], inviter.sent_invitations.to_a
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
test 'deleting an inviter preserves sent invitations' do
|
|
80
|
+
inviter = Admin.create!(email: 'admin@example.com', password: '123456789')
|
|
81
|
+
User.invite!({ email: 'invited@example.com' }, inviter)
|
|
82
|
+
invitation = DeviseInvitable::Invitation.last
|
|
83
|
+
|
|
84
|
+
inviter.destroy!
|
|
85
|
+
|
|
86
|
+
assert_predicate invitation.reload, :persisted?
|
|
87
|
+
assert_nil invitation.invited_by
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
test 'a placeholder is inactive until an invitation is accepted' do
|
|
91
|
+
User.create_resource_on_invitation = true
|
|
92
|
+
|
|
93
|
+
user = User.invite!(email: 'placeholder@example.com')
|
|
94
|
+
user.update!(confirmed_at: Time.now.utc)
|
|
95
|
+
|
|
96
|
+
assert_predicate user, :invitation_pending?
|
|
97
|
+
refute_predicate user, :active_for_authentication?
|
|
98
|
+
assert_nil user.valid_password?('unknown')
|
|
99
|
+
|
|
100
|
+
user.password = user.password_confirmation = '123456789'
|
|
101
|
+
assert user.accept_invitation!
|
|
102
|
+
refute_predicate user.reload, :invitation_pending?
|
|
103
|
+
assert_predicate user, :active_for_authentication?
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
test 'resource attributes raise when placeholder creation is disabled' do
|
|
107
|
+
User.create_resource_on_invitation = false
|
|
108
|
+
|
|
109
|
+
error = assert_raises DeviseInvitable::ResourceAttributesRequirePlaceholderError do
|
|
110
|
+
User.invite!(email: 'attributes@example.com', username: 'invited')
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
assert_includes error.message, 'username'
|
|
114
|
+
assert_includes error.message, 'create_resource_on_invitation is disabled'
|
|
115
|
+
assert_equal 0, DeviseInvitable::Invitation.count
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
test 'resource attributes assigned by a block raise when placeholder creation is disabled' do
|
|
119
|
+
User.create_resource_on_invitation = false
|
|
120
|
+
|
|
121
|
+
error = assert_raises DeviseInvitable::ResourceAttributesRequirePlaceholderError do
|
|
122
|
+
User.invite!(email: 'attributes@example.com') do |invitable|
|
|
123
|
+
invitable.username = 'invited'
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
assert_includes error.message, 'username'
|
|
128
|
+
assert_equal 0, DeviseInvitable::Invitation.count
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
test 'deferred invitations validate their invite keys' do
|
|
132
|
+
User.create_resource_on_invitation = false
|
|
133
|
+
|
|
134
|
+
invited = User.invite!(email: 'not-an-email')
|
|
135
|
+
|
|
136
|
+
assert_includes invited.errors.details[:email], error: :invalid
|
|
137
|
+
assert_equal 0, DeviseInvitable::Invitation.count
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
test 'legacy invitation data migration is idempotent' do
|
|
141
|
+
skip unless DEVISE_ORM == :mongoid
|
|
142
|
+
|
|
143
|
+
user = User.create!(email: 'legacy@example.com', password: '123456789')
|
|
144
|
+
created_at = 1.day.ago
|
|
145
|
+
User.collection.find(_id: user.id).update_one(
|
|
146
|
+
'$set' => {
|
|
147
|
+
invitation_token: 'legacy-digest',
|
|
148
|
+
invitation_created_at: created_at,
|
|
149
|
+
invitation_sent_at: created_at,
|
|
150
|
+
invited_by_type: 'User'
|
|
151
|
+
}
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
assert_equal 1, DeviseInvitable::Migrator.call(User)
|
|
155
|
+
assert_equal 0, DeviseInvitable::Migrator.call(User)
|
|
156
|
+
|
|
157
|
+
invitation = DeviseInvitable::Invitation.find_by!(invitation_token: 'legacy-digest')
|
|
158
|
+
assert_equal user, invitation.invitable
|
|
159
|
+
assert_equal({ 'email' => 'legacy@example.com' }, invitation.invite_key.to_h.stringify_keys)
|
|
160
|
+
assert_equal created_at.to_i, invitation.resource_created_at.to_i
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
test 'legacy invitation migration processes multiple resources in a batch' do
|
|
164
|
+
skip unless DEVISE_ORM == :mongoid
|
|
165
|
+
|
|
166
|
+
first = User.create!(email: 'first-legacy@example.com', password: '123456789')
|
|
167
|
+
second = User.create!(email: 'second-legacy@example.com', password: '123456789')
|
|
168
|
+
created_at = 1.day.ago
|
|
169
|
+
User.collection.find(_id: first.id).update_one(
|
|
170
|
+
'$set' => { invitation_token: 'first-legacy-digest', invitation_created_at: created_at }
|
|
171
|
+
)
|
|
172
|
+
User.collection.find(_id: second.id).update_one(
|
|
173
|
+
'$set' => { invitation_token: 'second-legacy-digest', invitation_created_at: created_at }
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
assert_equal 2, DeviseInvitable::Migrator.call(User)
|
|
177
|
+
assert_equal 2, DeviseInvitable::Invitation.where(:invitable_id.in => [first.id, second.id]).count
|
|
178
|
+
refute first.reload.attributes.key?('invitation_created_at')
|
|
179
|
+
refute second.reload.attributes.key?('invitation_created_at')
|
|
180
|
+
end
|
|
181
|
+
end
|
data/test/models_test.rb
CHANGED
|
@@ -32,10 +32,19 @@ class ModelsTest < ActiveSupport::TestCase
|
|
|
32
32
|
assert_nil User.invitation_limit
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
+
test 'does not create placeholder resources by default' do
|
|
36
|
+
assert_equal false, Devise.create_resource_on_invitation
|
|
37
|
+
end
|
|
38
|
+
|
|
35
39
|
test 'should have a default value for invite_key' do
|
|
36
40
|
assert !User.invite_key.nil?
|
|
37
41
|
end
|
|
38
42
|
|
|
43
|
+
test 'uses the root model class for invitations' do
|
|
44
|
+
assert_equal User, User.devise_invitable_base_class
|
|
45
|
+
assert_equal User, Invitable.devise_invitable_base_class
|
|
46
|
+
end
|
|
47
|
+
|
|
39
48
|
test 'set a custom value for invite_for' do
|
|
40
49
|
old_invite_for = User.invite_for
|
|
41
50
|
User.invite_for = 5.days
|
|
@@ -63,6 +72,31 @@ class ModelsTest < ActiveSupport::TestCase
|
|
|
63
72
|
User.invitation_limit = old_invitation_limit
|
|
64
73
|
end
|
|
65
74
|
|
|
75
|
+
test 'warns when deprecated invited_by settings are configured globally' do
|
|
76
|
+
DeviseInvitable.deprecator.expects(:warn).with(includes('invited_by_class_name')).once
|
|
77
|
+
DeviseInvitable.deprecator.expects(:warn).with(includes('invited_by_foreign_key')).once
|
|
78
|
+
|
|
79
|
+
Devise.invited_by_class_name = 'Admin'
|
|
80
|
+
Devise.invited_by_foreign_key = :inviter_id
|
|
81
|
+
ensure
|
|
82
|
+
Devise.class_variable_set(:@@invited_by_class_name, nil)
|
|
83
|
+
Devise.class_variable_set(:@@invited_by_foreign_key, nil)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
test 'warns when deprecated invited_by settings are configured on a model' do
|
|
87
|
+
DeviseInvitable.deprecator.expects(:warn).with(includes('invited_by_class_name')).once
|
|
88
|
+
DeviseInvitable.deprecator.expects(:warn).with(includes('invited_by_foreign_key')).once
|
|
89
|
+
|
|
90
|
+
model = Class.new(User) do
|
|
91
|
+
devise :invitable,
|
|
92
|
+
invited_by_class_name: 'Admin',
|
|
93
|
+
invited_by_foreign_key: :inviter_id
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
assert_equal 'Admin', model.invited_by_class_name
|
|
97
|
+
assert_equal :inviter_id, model.invited_by_foreign_key
|
|
98
|
+
end
|
|
99
|
+
|
|
66
100
|
test 'set a default value for validate_on_invite' do
|
|
67
101
|
assert_equal true, Invitable.validate_on_invite
|
|
68
102
|
end
|
|
@@ -34,9 +34,11 @@ class User < PARENT_MODEL_CLASS
|
|
|
34
34
|
validates_presence_of :encrypted_password, if: :password_required?
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
-
devise :database_authenticatable, :registerable, :validatable, :confirmable, :invitable, :recoverable
|
|
37
|
+
devise :database_authenticatable, :registerable, :validatable, :confirmable, :invitable, :recoverable,
|
|
38
|
+
create_resource_on_invitation: true
|
|
38
39
|
|
|
39
|
-
attr_accessor :
|
|
40
|
+
attr_accessor :before_invitation_created_callback_works, :after_invitation_created_callback_works,
|
|
41
|
+
:after_invitation_accepted_callback_works, :bio, :token
|
|
40
42
|
validates :username, length: { maximum: 20 }
|
|
41
43
|
|
|
42
44
|
attr_accessor :testing_accepted_or_not_invited
|
|
@@ -52,6 +54,10 @@ class User < PARENT_MODEL_CLASS
|
|
|
52
54
|
object.after_invitation_created_callback_works = true
|
|
53
55
|
end
|
|
54
56
|
|
|
57
|
+
before_invitation_created do |object|
|
|
58
|
+
object.before_invitation_created_callback_works = true
|
|
59
|
+
end
|
|
60
|
+
|
|
55
61
|
after_invitation_accepted do |object|
|
|
56
62
|
object.after_invitation_accepted_callback_works = true
|
|
57
63
|
end
|
|
@@ -120,15 +120,6 @@ Devise.setup do |config|
|
|
|
120
120
|
# Default: true
|
|
121
121
|
# config.resend_invitation = false
|
|
122
122
|
|
|
123
|
-
# The class name of the inviting model. If this is nil,
|
|
124
|
-
# the #invited_by association is declared to be polymorphic.
|
|
125
|
-
# Default: nil
|
|
126
|
-
# config.invited_by_class_name = 'User'
|
|
127
|
-
|
|
128
|
-
# The foreign key to the inviting model (if invited_by_class_name is set)
|
|
129
|
-
# Default: :invited_by_id
|
|
130
|
-
# config.invited_by_foreign_key = :invited_by_id
|
|
131
|
-
|
|
132
123
|
# The column name used for counter_cache column. If this is nil,
|
|
133
124
|
# the #invited_by association is declared without counter_cache.
|
|
134
125
|
# Default: nil
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
RailsApp::Application.routes.draw do
|
|
2
2
|
devise_for :users
|
|
3
3
|
devise_scope :user do
|
|
4
|
+
resource :boolean_inviter_invitation, only: [:new, :create]
|
|
4
5
|
resource :free_invitation, only: [:new, :create]
|
|
6
|
+
resource :restricted_invitation, only: [:new, :create]
|
|
5
7
|
resource :admin, only: [:new, :create]
|
|
6
8
|
end
|
|
7
9
|
devise_for :admins
|
|
@@ -33,6 +33,28 @@ class CreateTables < (Rails.version < '5.1' ? ActiveRecord::Migration : ActiveRe
|
|
|
33
33
|
end
|
|
34
34
|
add_index :users, :invitation_token, :unique => true
|
|
35
35
|
|
|
36
|
+
create_table :devise_invitations do |t|
|
|
37
|
+
t.string :invitation_token
|
|
38
|
+
t.datetime :invitation_created_at
|
|
39
|
+
t.datetime :invitation_sent_at
|
|
40
|
+
t.datetime :invitation_accepted_at
|
|
41
|
+
t.datetime :superseded_at
|
|
42
|
+
t.string :superseded_reason
|
|
43
|
+
t.datetime :revoked_at
|
|
44
|
+
t.datetime :resource_created_at
|
|
45
|
+
t.json :invite_key, null: false, default: {}
|
|
46
|
+
t.string :invite_key_digest, null: false
|
|
47
|
+
t.integer :invitable_id
|
|
48
|
+
t.string :invitable_type
|
|
49
|
+
t.integer :invited_by_id
|
|
50
|
+
t.string :invited_by_type
|
|
51
|
+
t.timestamps
|
|
52
|
+
end
|
|
53
|
+
add_index :devise_invitations, :invitation_token, unique: true
|
|
54
|
+
add_index :devise_invitations, [:invitable_type, :invitable_id]
|
|
55
|
+
add_index :devise_invitations, [:invited_by_type, :invited_by_id]
|
|
56
|
+
add_index :devise_invitations, [:invitable_type, :invite_key_digest]
|
|
57
|
+
|
|
36
58
|
create_table :admins do |t|
|
|
37
59
|
## Database authenticatable
|
|
38
60
|
t.string :email, :null => true, :default => ""
|
data/test/routes_test.rb
CHANGED
|
@@ -2,6 +2,12 @@ require 'test_helper'
|
|
|
2
2
|
|
|
3
3
|
class RoutesTest < ActionController::TestCase
|
|
4
4
|
|
|
5
|
+
test 'preserve custom controller module for registrations' do
|
|
6
|
+
mapping = Devise::Mapping.new(:users, module: :users)
|
|
7
|
+
|
|
8
|
+
assert_equal 'users/registrations', mapping.controllers[:registrations]
|
|
9
|
+
end
|
|
10
|
+
|
|
5
11
|
test 'map new user invitation' do
|
|
6
12
|
assert_recognizes({ controller: 'devise/invitations', action: 'new' }, { path: 'users/invitation/new', method: :get })
|
|
7
13
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: devise_invitable
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 3.0.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sergio Cambra
|
|
@@ -15,42 +15,42 @@ dependencies:
|
|
|
15
15
|
requirements:
|
|
16
16
|
- - ">="
|
|
17
17
|
- !ruby/object:Gem::Version
|
|
18
|
-
version: '
|
|
18
|
+
version: '7.0'
|
|
19
19
|
type: :runtime
|
|
20
20
|
prerelease: false
|
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
22
22
|
requirements:
|
|
23
23
|
- - ">="
|
|
24
24
|
- !ruby/object:Gem::Version
|
|
25
|
-
version: '
|
|
25
|
+
version: '7.0'
|
|
26
26
|
- !ruby/object:Gem::Dependency
|
|
27
27
|
name: devise
|
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
|
29
29
|
requirements:
|
|
30
30
|
- - ">="
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: '
|
|
32
|
+
version: '5.0'
|
|
33
33
|
type: :runtime
|
|
34
34
|
prerelease: false
|
|
35
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
36
36
|
requirements:
|
|
37
37
|
- - ">="
|
|
38
38
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: '
|
|
39
|
+
version: '5.0'
|
|
40
40
|
- !ruby/object:Gem::Dependency
|
|
41
41
|
name: bundler
|
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
|
43
43
|
requirements:
|
|
44
|
-
- - "
|
|
44
|
+
- - ">="
|
|
45
45
|
- !ruby/object:Gem::Version
|
|
46
|
-
version: '
|
|
46
|
+
version: '2.0'
|
|
47
47
|
type: :development
|
|
48
48
|
prerelease: false
|
|
49
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
50
50
|
requirements:
|
|
51
|
-
- - "
|
|
51
|
+
- - ">="
|
|
52
52
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: '
|
|
53
|
+
version: '2.0'
|
|
54
54
|
description: It adds support for send invitations by email (it requires to be authenticated)
|
|
55
55
|
and accept the invitation by setting a password.
|
|
56
56
|
email:
|
|
@@ -95,23 +95,30 @@ files:
|
|
|
95
95
|
- config/locales/zh-TW.yml
|
|
96
96
|
- lib/devise_invitable.rb
|
|
97
97
|
- lib/devise_invitable/controllers/helpers.rb
|
|
98
|
+
- lib/devise_invitable/invitation.rb
|
|
98
99
|
- lib/devise_invitable/inviter.rb
|
|
99
100
|
- lib/devise_invitable/mailer.rb
|
|
100
101
|
- lib/devise_invitable/mapping.rb
|
|
102
|
+
- lib/devise_invitable/migrator.rb
|
|
101
103
|
- lib/devise_invitable/models.rb
|
|
102
104
|
- lib/devise_invitable/models/authenticatable.rb
|
|
103
105
|
- lib/devise_invitable/parameter_sanitizer.rb
|
|
104
106
|
- lib/devise_invitable/rails.rb
|
|
105
107
|
- lib/devise_invitable/routes.rb
|
|
106
108
|
- lib/devise_invitable/version.rb
|
|
107
|
-
- lib/generators/active_record/
|
|
108
|
-
- lib/generators/active_record/
|
|
109
|
+
- lib/generators/active_record/devise_invitable_install_generator.rb
|
|
110
|
+
- lib/generators/active_record/devise_invitable_upgrade_generator.rb
|
|
111
|
+
- lib/generators/active_record/templates/create_devise_invitations.rb
|
|
112
|
+
- lib/generators/active_record/templates/upgrade_devise_invitations.rb
|
|
109
113
|
- lib/generators/devise_invitable/devise_invitable_generator.rb
|
|
110
114
|
- lib/generators/devise_invitable/install_generator.rb
|
|
111
115
|
- lib/generators/devise_invitable/templates/simple_form_for/invitations/edit.html.erb
|
|
112
116
|
- lib/generators/devise_invitable/templates/simple_form_for/invitations/new.html.erb
|
|
117
|
+
- lib/generators/devise_invitable/upgrade_generator.rb
|
|
113
118
|
- lib/generators/devise_invitable/views_generator.rb
|
|
114
|
-
- lib/generators/mongoid/
|
|
119
|
+
- lib/generators/mongoid/devise_invitable_install_generator.rb
|
|
120
|
+
- lib/generators/mongoid/devise_invitable_upgrade_generator.rb
|
|
121
|
+
- lib/tasks/devise_invitable_tasks.rake
|
|
115
122
|
- test/functional/controller_helpers_test.rb
|
|
116
123
|
- test/functional/registrations_controller_test.rb
|
|
117
124
|
- test/generators/views_generator_test.rb
|
|
@@ -123,14 +130,17 @@ files:
|
|
|
123
130
|
- test/mailers/parent_mailer_test.rb
|
|
124
131
|
- test/model_tests_helper.rb
|
|
125
132
|
- test/models/invitable_test.rb
|
|
133
|
+
- test/models/separate_invitations_test.rb
|
|
126
134
|
- test/models_test.rb
|
|
127
135
|
- test/orm/active_record.rb
|
|
128
136
|
- test/orm/mongoid.rb
|
|
129
137
|
- test/rails_app/Rakefile
|
|
130
138
|
- test/rails_app/app/controllers/admins_controller.rb
|
|
131
139
|
- test/rails_app/app/controllers/application_controller.rb
|
|
140
|
+
- test/rails_app/app/controllers/boolean_inviter_invitations_controller.rb
|
|
132
141
|
- test/rails_app/app/controllers/free_invitations_controller.rb
|
|
133
142
|
- test/rails_app/app/controllers/home_controller.rb
|
|
143
|
+
- test/rails_app/app/controllers/restricted_invitations_controller.rb
|
|
134
144
|
- test/rails_app/app/controllers/users_controller.rb
|
|
135
145
|
- test/rails_app/app/helpers/application_helper.rb
|
|
136
146
|
- test/rails_app/app/mailers/application_mailer.rb
|
|
@@ -182,7 +192,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
182
192
|
requirements:
|
|
183
193
|
- - ">="
|
|
184
194
|
- !ruby/object:Gem::Version
|
|
185
|
-
version: 2.
|
|
195
|
+
version: 2.7.0
|
|
186
196
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
187
197
|
requirements:
|
|
188
198
|
- - ">="
|
|
@@ -204,14 +214,17 @@ test_files:
|
|
|
204
214
|
- test/mailers/parent_mailer_test.rb
|
|
205
215
|
- test/model_tests_helper.rb
|
|
206
216
|
- test/models/invitable_test.rb
|
|
217
|
+
- test/models/separate_invitations_test.rb
|
|
207
218
|
- test/models_test.rb
|
|
208
219
|
- test/orm/active_record.rb
|
|
209
220
|
- test/orm/mongoid.rb
|
|
210
221
|
- test/rails_app/Rakefile
|
|
211
222
|
- test/rails_app/app/controllers/admins_controller.rb
|
|
212
223
|
- test/rails_app/app/controllers/application_controller.rb
|
|
224
|
+
- test/rails_app/app/controllers/boolean_inviter_invitations_controller.rb
|
|
213
225
|
- test/rails_app/app/controllers/free_invitations_controller.rb
|
|
214
226
|
- test/rails_app/app/controllers/home_controller.rb
|
|
227
|
+
- test/rails_app/app/controllers/restricted_invitations_controller.rb
|
|
215
228
|
- test/rails_app/app/controllers/users_controller.rb
|
|
216
229
|
- test/rails_app/app/helpers/application_helper.rb
|
|
217
230
|
- test/rails_app/app/mailers/application_mailer.rb
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
require 'rails/generators/active_record'
|
|
2
|
-
|
|
3
|
-
module ActiveRecord
|
|
4
|
-
module Generators
|
|
5
|
-
class DeviseInvitableGenerator < ActiveRecord::Generators::Base
|
|
6
|
-
source_root File.expand_path('../templates', __FILE__)
|
|
7
|
-
|
|
8
|
-
def copy_devise_migration
|
|
9
|
-
migration_template 'migration.rb', "db/migrate/devise_invitable_add_to_#{table_name}.rb", migration_version: migration_version
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def migration_version
|
|
13
|
-
if Rails::VERSION::MAJOR >= 5
|
|
14
|
-
"[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
class DeviseInvitableAddTo<%= table_name.camelize %> < ActiveRecord::Migration<%= migration_version %>
|
|
2
|
-
def up
|
|
3
|
-
change_table :<%= table_name %> do |t|
|
|
4
|
-
t.string :invitation_token
|
|
5
|
-
t.datetime :invitation_created_at
|
|
6
|
-
t.datetime :invitation_sent_at
|
|
7
|
-
t.datetime :invitation_accepted_at
|
|
8
|
-
t.integer :invitation_limit
|
|
9
|
-
t.references :invited_by, polymorphic: true
|
|
10
|
-
t.integer :invitations_count, default: 0
|
|
11
|
-
t.index :invitation_token, unique: true # for invitable
|
|
12
|
-
t.index :invited_by_id
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def down
|
|
17
|
-
change_table :<%= table_name %> do |t|
|
|
18
|
-
t.remove_references :invited_by, polymorphic: true
|
|
19
|
-
t.remove :invitations_count, :invitation_limit, :invitation_sent_at, :invitation_accepted_at, :invitation_token, :invitation_created_at
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|