devise_invitable 2.0.13 → 3.0.0
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 +41 -0
- data/README.md +108 -97
- data/app/controllers/devise/invitations_controller.rb +1 -1
- 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 +328 -81
- data/lib/devise_invitable/rails.rb +15 -16
- data/lib/devise_invitable/version.rb +1 -1
- data/lib/devise_invitable.rb +39 -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 +3 -3
- data/test/mailers/invitation_mail_test.rb +1 -0
- data/test/mailers/parent_mailer_test.rb +31 -0
- data/test/models/separate_invitations_test.rb +181 -0
- data/test/models_test.rb +34 -0
- data/test/rails_app/app/mailers/application_mailer.rb +2 -0
- data/test/rails_app/app/models/user.rb +2 -1
- data/test/rails_app/config/initializers/devise.rb +0 -9
- data/test/rails_app/db/migrate/20100401102949_create_tables.rb +22 -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,7 +34,8 @@ 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
40
|
attr_accessor :after_invitation_created_callback_works, :after_invitation_accepted_callback_works, :bio, :token
|
|
40
41
|
validates :username, length: { maximum: 20 }
|
|
@@ -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
|
|
@@ -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 => ""
|
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.0
|
|
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
|
|
@@ -120,8 +127,10 @@ files:
|
|
|
120
127
|
- test/integration/invitation_test.rb
|
|
121
128
|
- test/integration_tests_helper.rb
|
|
122
129
|
- test/mailers/invitation_mail_test.rb
|
|
130
|
+
- test/mailers/parent_mailer_test.rb
|
|
123
131
|
- test/model_tests_helper.rb
|
|
124
132
|
- test/models/invitable_test.rb
|
|
133
|
+
- test/models/separate_invitations_test.rb
|
|
125
134
|
- test/models_test.rb
|
|
126
135
|
- test/orm/active_record.rb
|
|
127
136
|
- test/orm/mongoid.rb
|
|
@@ -132,6 +141,7 @@ files:
|
|
|
132
141
|
- test/rails_app/app/controllers/home_controller.rb
|
|
133
142
|
- test/rails_app/app/controllers/users_controller.rb
|
|
134
143
|
- test/rails_app/app/helpers/application_helper.rb
|
|
144
|
+
- test/rails_app/app/mailers/application_mailer.rb
|
|
135
145
|
- test/rails_app/app/models/admin.rb
|
|
136
146
|
- test/rails_app/app/models/octopussy.rb
|
|
137
147
|
- test/rails_app/app/models/user.rb
|
|
@@ -180,7 +190,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
180
190
|
requirements:
|
|
181
191
|
- - ">="
|
|
182
192
|
- !ruby/object:Gem::Version
|
|
183
|
-
version: 2.
|
|
193
|
+
version: 2.7.0
|
|
184
194
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
185
195
|
requirements:
|
|
186
196
|
- - ">="
|
|
@@ -199,8 +209,10 @@ test_files:
|
|
|
199
209
|
- test/integration/invitation_test.rb
|
|
200
210
|
- test/integration_tests_helper.rb
|
|
201
211
|
- test/mailers/invitation_mail_test.rb
|
|
212
|
+
- test/mailers/parent_mailer_test.rb
|
|
202
213
|
- test/model_tests_helper.rb
|
|
203
214
|
- test/models/invitable_test.rb
|
|
215
|
+
- test/models/separate_invitations_test.rb
|
|
204
216
|
- test/models_test.rb
|
|
205
217
|
- test/orm/active_record.rb
|
|
206
218
|
- test/orm/mongoid.rb
|
|
@@ -211,6 +223,7 @@ test_files:
|
|
|
211
223
|
- test/rails_app/app/controllers/home_controller.rb
|
|
212
224
|
- test/rails_app/app/controllers/users_controller.rb
|
|
213
225
|
- test/rails_app/app/helpers/application_helper.rb
|
|
226
|
+
- test/rails_app/app/mailers/application_mailer.rb
|
|
214
227
|
- test/rails_app/app/models/admin.rb
|
|
215
228
|
- test/rails_app/app/models/octopussy.rb
|
|
216
229
|
- test/rails_app/app/models/user.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
|