devise_invitable 2.0.6 → 2.0.8

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.

Potentially problematic release.


This version of devise_invitable might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3803fa69fe6bdecc811ab934878cc365f31ae0a124e54bbde34ad967752f1d3c
4
- data.tar.gz: df5c2b785956d22e8bf69d644326605a649f1fd76b1d19af04d4bcd48a3c15f6
3
+ metadata.gz: 1d79a9c9139872616687b6479929d53572f9634188eeb9a83a7fdb56c9a56de0
4
+ data.tar.gz: dd37eafdb0b8a074c11ab51c25b8faea114992cf640e599edb5b9fefec0eb9a3
5
5
  SHA512:
6
- metadata.gz: 925df2c1ef1a893f9e4d9b376b298fa5e21a4c516d8829d7990aa5e5b4a18a7d288d209658f38a1793c51b5a4fca83cbff814a19f2e725ddd8baa4307f448092
7
- data.tar.gz: 4380da8ff7d5ff6e680393ab8f8935dae7b10e3d50271fdfaa839d0968caad99a56282ba6765b3d18f2f70090796c607c0198dc3932f3ac21f24821a8635a4e5
6
+ metadata.gz: a275438d6791f2f3e06d3d7a0b83db15142ce0a24337f928e08ee7c9818aa517efaa070c73e2bfc280a28ef8cf1104a9aa6711c8325479c02a794a1b963ec9d5
7
+ data.tar.gz: cef6663d0ce1f61b87dcc73cf151afa55a4054983c8a580d2a94446887f5018a5ba604eea0a656495e2ae3755bc437457c1d109d1ae8faf775182417c4ca313f
data/CHANGELOG.md CHANGED
@@ -1,6 +1,16 @@
1
+ ## 2.0.8
2
+ - Fix for turbo stream
3
+
4
+ ## 2.0.7
5
+ - Allow customizing invalid_token_path_for, the path to redirect users who try to accept with invalid token
6
+ - Don't override registrations controller in routes if module option is used
7
+ - Fix typo in spanish translation, add Catalan translation ([#857](https://github.com/scambra/devise_invitable/pull/857))
8
+ - Fix for ruby 3.2.0
9
+
1
10
  ## 2.0.6
2
11
  - Fix submit form failure with turbolinks, fixes ([#865](https://github.com/scambra/devise_invitable/issues/865))
3
12
  - Fix obsolete symbols in German translation ([#864](https://github.com/scambra/devise_invitable/pull/864))
13
+ - Allow to provide validate option to the instance method "invite!", default to follow the setting validate_on_invite
4
14
 
5
15
  ## 2.0.5
6
16
  - Fix NoMethodError in random_password when validatable is not used ([#850](https://github.com/scambra/devise_invitable/pull/850))
data/README.rdoc CHANGED
@@ -1,5 +1,7 @@
1
1
  = DeviseInvitable
2
- {<img src="https://badge.fury.io/rb/devise_invitable.svg"/>}[http://badge.fury.io/rb/devise_invitable] {<img src="https://travis-ci.org/scambra/devise_invitable.svg"/>}[https://travis-ci.org/scambra/devise_invitable] {<img src="https://codeclimate.com/github/scambra/devise_invitable/badges/gpa.svg"/>}[https://codeclimate.com/github/scambra/devise_invitable]
2
+ {<img src="https://badge.fury.io/rb/devise_invitable.svg"/>}[http://badge.fury.io/rb/devise_invitable]
3
+ {<img src="https://github.com/scambra/devise_invitable/actions/workflows/ci.yml/badge.svg"/>}[https://github.com/scambra/devise_invitable/actions/workflows/ci.yml]
4
+ {<img src="https://codeclimate.com/github/scambra/devise_invitable/badges/gpa.svg"/>}[https://codeclimate.com/github/scambra/devise_invitable]
3
5
 
4
6
  It adds support to Devise[https://github.com/plataformatec/devise] for sending invitations by email (it requires to be authenticated) and accept the invitation setting the password.
5
7
 
@@ -339,7 +341,7 @@ To accept an invitation with a token use the <tt>accept_invitation!</tt> class m
339
341
  === Callbacks
340
342
 
341
343
  A callback event is fired before and after an invitation is created (User#invite!) or accepted (User#accept_invitation!). For example, in your resource model you can add:
342
-
344
+ # Note: callbacks should be placed after devise: :invitable is specified.
343
345
  before_invitation_created :email_admins
344
346
  after_invitation_accepted :email_invited_by
345
347
 
@@ -370,7 +372,7 @@ After an invitation is created and sent, the inviter will be redirected to <tt>a
370
372
 
371
373
  After an invitation is accepted, the invitee will be redirected to <tt>after_accept_path_for(resource)</tt>, which is the same path as <tt>signed_in_root_path</tt> by default. If you want to override the path, override invitations controller and define <tt>after_accept_path_for</tt> method. This is useful in the common case that a user is invited to a specific location in your application. More on {Devise's README}[https://github.com/plataformatec/devise], "Controller filters and helpers" section.
372
374
 
373
- The invitation email includes a link to accept the invitation that looks like this: <tt>/users/invitation/accept?invitation_token=abcd123</tt>. When clicked, the invited must set a password in order to accept its invitation. Note that if the <tt>invitation_token</tt> is not present or not valid, the invited is redirected to <tt>after_sign_out_path_for(resource_name)</tt>.
375
+ The invitation email includes a link to accept the invitation that looks like this: <tt>/users/invitation/accept?invitation_token=abcd123</tt>. When clicked, the invited must set a password in order to accept its invitation. Note that if the <tt>invitation_token</tt> is not present or not valid, the invited is redirected to <tt>invalid_token_path_for(resource_name)</tt>, which by default is <tt>after_sign_out_path_for(resource_name)</tt>.
374
376
 
375
377
  The controller sets the <tt>invited_by_id</tt> attribute for the new user to the current user. This will let you easily keep track of who invited whom.
376
378
 
@@ -31,7 +31,7 @@ class Devise::InvitationsController < DeviseController
31
31
  respond_with resource, location: after_invite_path_for(current_inviter, resource)
32
32
  end
33
33
  else
34
- respond_with_navigational(resource) { render :new, status: :unprocessable_entity }
34
+ respond_with(resource)
35
35
  end
36
36
  end
37
37
 
@@ -63,7 +63,7 @@ class Devise::InvitationsController < DeviseController
63
63
  end
64
64
  else
65
65
  resource.invitation_token = raw_invitation_token
66
- respond_with_navigational(resource) { render :edit, status: :unprocessable_entity }
66
+ respond_with(resource)
67
67
  end
68
68
  end
69
69
 
@@ -99,7 +99,7 @@ class Devise::InvitationsController < DeviseController
99
99
  def resource_from_invitation_token
100
100
  unless params[:invitation_token] && self.resource = resource_class.find_by_invitation_token(params[:invitation_token], true)
101
101
  set_flash_message(:alert, :invitation_token_invalid) if is_flashing_format?
102
- redirect_to after_sign_out_path_for(resource_name)
102
+ redirect_to invalid_token_path_for(resource_name)
103
103
  end
104
104
  end
105
105
 
@@ -0,0 +1,32 @@
1
+
2
+ ca:
3
+ devise:
4
+ failure:
5
+ invited: "Tens una invitació pendent, accepta-la per acabar de crear el teu compte."
6
+ invitations:
7
+ send_instructions: "S'ha enviat una invitació a %{email}."
8
+ invitation_token_invalid: "La invitació no es vàlida!"
9
+ updated: "S'ha configurat la seva contrasenya i s'ha ingressat al sistema"
10
+ updated_not_active: "La seva contrasenya s'ha configurat correctament."
11
+ no_invitations_remaining: "No queden invitacions"
12
+ invitation_removed: "S'ha retirat la seva invitació"
13
+ new:
14
+ header: "Enviar Invitació"
15
+ submit_button: "Envia una invitació"
16
+ edit:
17
+ header: "Establir contrasenya"
18
+ submit_button: "Guardar la meva contrasenya"
19
+ mailer:
20
+ invitation_instructions:
21
+ subject: "Instruccions de la invitació"
22
+ hello: "Hola %{email}"
23
+ someone_invited_you: "Has estat invitat a %{url}, pots acceptar-ho seguint el següent enllaç"
24
+ accept: "Aceptar la invitació"
25
+ accept_until: "Aquesta invitació expirarà en %{due_date}."
26
+ ignore: "Si no li interessa aquesta invitació, simplement ignori aquest correu. No es crearà el teu compte fins que accedeixis a l'anterior enllaç i creïs una contrasenya"
27
+ time:
28
+ formats:
29
+ devise:
30
+ mailer:
31
+ invitation_instructions:
32
+ accept_until_format: "%d de %B de %Y, %H:%M"
@@ -17,7 +17,7 @@ es:
17
17
  submit_button: "Guardar mi contraseña"
18
18
  mailer:
19
19
  invitation_instructions:
20
- subject: "Instruciones de la invitación"
20
+ subject: "Instrucciones de la invitación"
21
21
  hello: "Hola %{email}"
22
22
  someone_invited_you: "Has sido invitado a %{url}, puedes aceptarlo siguiendo el siguiente enlace"
23
23
  accept: "Aceptar la invitación"
@@ -12,6 +12,10 @@ module DeviseInvitable::Controllers::Helpers
12
12
  signed_in_root_path(resource)
13
13
  end
14
14
 
15
+ def invalid_token_path_for(resource_name)
16
+ after_sign_out_path_for(resource_name)
17
+ end
18
+
15
19
  protected
16
20
 
17
21
  def authenticate_inviter!
@@ -3,8 +3,10 @@ module DeviseInvitable
3
3
  private
4
4
 
5
5
  def default_controllers(options)
6
- options[:controllers] ||= {}
7
- options[:controllers][:registrations] ||= 'devise_invitable/registrations'
6
+ unless options[:module]
7
+ options[:controllers] ||= {}
8
+ options[:controllers][:registrations] ||= 'devise_invitable/registrations'
9
+ end
8
10
  super
9
11
  end
10
12
  end
@@ -1,3 +1,3 @@
1
1
  module DeviseInvitable
2
- VERSION = '2.0.6'.freeze
2
+ VERSION = '2.0.8'.freeze
3
3
  end
@@ -7,7 +7,7 @@ module DeviseInvitable
7
7
 
8
8
  def inject_devise_invitable_content
9
9
  path = File.join('app', 'models', "#{file_path}.rb")
10
- inject_into_file(path, 'invitable, :', after: 'devise :') if File.exists?(path)
10
+ inject_into_file(path, 'invitable, :', after: 'devise :') if File.exist?(path)
11
11
  end
12
12
 
13
13
  hook_for :orm
@@ -41,4 +41,14 @@ class ControllerHelpersTest < ActionController::TestCase
41
41
  assert Devise::InvitationsController.method_defined? :after_accept_path_for
42
42
  assert !Devise::InvitationsController.instance_methods(false).include?(:after_accept_path_for)
43
43
  end
44
+
45
+ test 'invalid token path defaults to after sign out path' do
46
+ assert_equal @controller.send(:after_sign_out_path_for, :user), @controller.invalid_token_path_for(:user)
47
+ end
48
+
49
+ test 'invalid token path is customizable from application controller' do
50
+ custom_path = 'customized/invalid/token/path'
51
+ @controller.instance_eval "def invalid_token_path_for(resource_name) '#{custom_path}' end"
52
+ assert_equal @controller.invalid_token_path_for(:user), custom_path
53
+ end
44
54
  end
@@ -98,7 +98,7 @@ class InvitationTest < ActionDispatch::IntegrationTest
98
98
  fill_in 'Password confirmation', with: 'other_password'
99
99
  end
100
100
  assert_equal user_invitation_path, current_path
101
- assert page.has_css?('#error_explanation li', text: /Password .*doesn\'t match/)
101
+ assert page.has_css?('#error_explanation li', text: /Password .*doesn['’]t match/)
102
102
  assert !user.confirmed?
103
103
  end
104
104
 
@@ -102,7 +102,7 @@ class InvitationMailTest < ActionMailer::TestCase
102
102
  def initialize(*args); end
103
103
  def deliver; end
104
104
  end
105
- Devise.mailer = CustomMailer
105
+ Devise.mailer = 'InvitationMailTest::CustomMailer'
106
106
 
107
107
  User.invite!({ email: 'valid@email.com' }, nil, { invited_at: Time.now })
108
108
  end
@@ -1,6 +1,6 @@
1
1
  class ActiveSupport::TestCase
2
2
  def setup_mailer
3
- Devise.mailer = Devise::Mailer
3
+ Devise.mailer = 'Devise::Mailer'
4
4
  ActionMailer::Base.deliveries = []
5
5
  end
6
6
 
@@ -89,12 +89,12 @@ class InvitableTest < ActiveSupport::TestCase
89
89
  user.invite!
90
90
  old_invitation_created_at = 3.days.ago
91
91
  old_invitation_sent_at = 3.days.ago
92
- user.update_attributes(invitation_sent_at: old_invitation_sent_at, invitation_created_at: old_invitation_created_at)
92
+ user.update(invitation_sent_at: old_invitation_sent_at, invitation_created_at: old_invitation_created_at)
93
93
  3.times do
94
94
  user.invite!
95
95
  refute_equal old_invitation_sent_at, user.invitation_sent_at
96
96
  refute_equal old_invitation_created_at, user.invitation_created_at
97
- user.update_attributes(invitation_sent_at: old_invitation_sent_at, invitation_created_at: old_invitation_created_at)
97
+ user.update(invitation_sent_at: old_invitation_sent_at, invitation_created_at: old_invitation_created_at)
98
98
  end
99
99
  end
100
100
 
@@ -371,10 +371,10 @@ class InvitableTest < ActiveSupport::TestCase
371
371
  existing_user.save(validate: false)
372
372
  user = User.invite!(email: 'valid@email.com')
373
373
  assert_equal user, existing_user
374
- assert_equal ['has already been taken'], user.errors[:email]
374
+ assert_equal [{error: :taken}], user.errors.details[:email]
375
375
  same_user = User.invite!(email: 'valid@email.com')
376
376
  assert_equal same_user, existing_user
377
- assert_equal ['has already been taken'], same_user.errors[:email]
377
+ assert_equal [{error: :taken}], same_user.errors.details[:email]
378
378
  end
379
379
 
380
380
  test 'should return a record with errors if user with pending invitation was found by e-mail' do
@@ -388,7 +388,7 @@ class InvitableTest < ActiveSupport::TestCase
388
388
 
389
389
  user = User.invite!(email: 'valid@email.com')
390
390
  assert_equal user, existing_user
391
- assert_equal ['has already been taken'], user.errors[:email]
391
+ assert_equal [{error: :taken}], user.errors.details[:email]
392
392
  ensure
393
393
  User.resend_invitation = resend_invitation
394
394
  end
@@ -402,7 +402,7 @@ class InvitableTest < ActiveSupport::TestCase
402
402
  existing_user.save(validate: false)
403
403
  user = User.invite!(email: 'valid@email.com', username: 'a' * 50)
404
404
  assert_equal user, existing_user
405
- assert_equal ['has already been taken'], user.errors[:email]
405
+ assert_equal [{error: :taken}], user.errors.details[:email]
406
406
  refute_empty user.errors[:username]
407
407
  ensure
408
408
  User.validate_on_invite = validate_on_invite
@@ -412,13 +412,13 @@ class InvitableTest < ActiveSupport::TestCase
412
412
  test 'should return a new record with errors if e-mail is blank' do
413
413
  invited_user = User.invite!(email: '')
414
414
  assert invited_user.new_record?
415
- assert_equal ["can't be blank"], invited_user.errors[:email]
415
+ assert_equal [{error: :blank}], invited_user.errors.details[:email]
416
416
  end
417
417
 
418
418
  test 'should return a new record with errors if e-mail is invalid' do
419
419
  invited_user = User.invite!(email: 'invalid_email')
420
420
  assert invited_user.new_record?
421
- assert_equal ['is invalid'], invited_user.errors[:email]
421
+ assert_equal [{error: :invalid}], invited_user.errors.details[:email]
422
422
  end
423
423
 
424
424
  test 'should set all attributes with errors if e-mail is invalid' do
@@ -438,13 +438,13 @@ class InvitableTest < ActiveSupport::TestCase
438
438
  test 'should return a new record with errors if no invitation_token is found' do
439
439
  invited_user = User.accept_invitation!(invitation_token: 'invalid_token')
440
440
  assert invited_user.new_record?
441
- assert_equal ['is invalid'], invited_user.errors[:invitation_token]
441
+ assert_equal [{error: :invalid}], invited_user.errors.details[:invitation_token]
442
442
  end
443
443
 
444
444
  test 'should return a new record with errors if invitation_token is blank' do
445
445
  invited_user = User.accept_invitation!(invitation_token: '')
446
446
  assert invited_user.new_record?
447
- assert_equal ["can't be blank"], invited_user.errors[:invitation_token]
447
+ assert_equal [{error: :blank}], invited_user.errors.details[:invitation_token]
448
448
  end
449
449
 
450
450
  test 'should return record with errors if invitation_token has expired' do
@@ -454,7 +454,7 @@ class InvitableTest < ActiveSupport::TestCase
454
454
  invited_user.save(validate: false)
455
455
  user = User.accept_invitation!(invitation_token: Thread.current[:token])
456
456
  assert_equal user, invited_user
457
- assert_equal ['is invalid'], user.errors[:invitation_token]
457
+ assert_equal [{error: :invalid}], user.errors.details[:invitation_token]
458
458
  end
459
459
 
460
460
  test 'should allow record modification using block' do
@@ -1,7 +1,12 @@
1
1
  ActiveRecord::Migration.verbose = false
2
2
  ActiveRecord::Base.logger = Logger.new(nil)
3
3
 
4
- if defined? ActiveRecord::MigrationContext # rails >= 5.2
4
+ if ActiveRecord::VERSION::MAJOR >= 6
5
+ ActiveRecord::MigrationContext.new(
6
+ File.expand_path('../../rails_app/db/migrate/', __FILE__),
7
+ ActiveRecord::Base.connection.schema_migration
8
+ ).migrate
9
+ elsif defined? ActiveRecord::MigrationContext # rails >= 5.2
5
10
  ActiveRecord::MigrationContext.new(File.expand_path('../../rails_app/db/migrate/', __FILE__)).migrate
6
11
  else
7
12
  ActiveRecord::Migrator.migrate(File.expand_path('../../rails_app/db/migrate/', __FILE__))
data/test/test_helper.rb CHANGED
@@ -7,7 +7,7 @@ require "rails_app/config/environment"
7
7
  require 'rails/test_help'
8
8
  require "orm/#{DEVISE_ORM}"
9
9
  require 'capybara/rails'
10
- require 'mocha/setup'
10
+ require 'mocha/minitest'
11
11
 
12
12
  ActionMailer::Base.delivery_method = :test
13
13
  ActionMailer::Base.perform_deliveries = true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise_invitable
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.6
4
+ version: 2.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergio Cambra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-15 00:00:00.000000000 Z
11
+ date: 2023-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionmailer
@@ -70,6 +70,7 @@ files:
70
70
  - app/views/devise/mailer/invitation_instructions.html.erb
71
71
  - app/views/devise/mailer/invitation_instructions.text.erb
72
72
  - config/locales/ar.yml
73
+ - config/locales/ca.yml
73
74
  - config/locales/da.yml
74
75
  - config/locales/de.yml
75
76
  - config/locales/en.yml
@@ -186,7 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
187
  - !ruby/object:Gem::Version
187
188
  version: '0'
188
189
  requirements: []
189
- rubygems_version: 3.0.9
190
+ rubygems_version: 3.3.7
190
191
  signing_key:
191
192
  specification_version: 4
192
193
  summary: An invitation strategy for Devise