devise-async 0.4.0 → 0.5.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.
- data/CHANGELOG.md +6 -0
- data/README.md +16 -4
- data/devise-async.gemspec +3 -2
- data/lib/devise/async.rb +8 -21
- data/lib/devise/async/backend.rb +2 -0
- data/lib/devise/async/backend/queue_classic.rb +20 -0
- data/lib/devise/async/model.rb +16 -0
- data/lib/devise/async/proxy.rb +1 -1
- data/lib/devise/async/version.rb +1 -1
- data/lib/devise/async/worker.rb +2 -0
- data/test/devise/async/backend/queue_classic_test.rb +29 -0
- data/test/devise/async/backend_test.rb +4 -0
- data/test/devise/async/worker_test.rb +7 -0
- data/test/support/rails_app/config/initializers/devise.rb +1 -0
- metadata +27 -7
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -7,6 +7,7 @@ Supported backends:
|
|
7
7
|
* Resque
|
8
8
|
* Sidekiq
|
9
9
|
* Delayed::Job
|
10
|
+
* QueueClassic
|
10
11
|
|
11
12
|
## Installation
|
12
13
|
|
@@ -37,7 +38,7 @@ end
|
|
37
38
|
Set your queuing backend by creating `config/initializers/devise_async.rb`:
|
38
39
|
|
39
40
|
```ruby
|
40
|
-
# Supported options: :resque, :sidekiq, :delayed_job
|
41
|
+
# Supported options: :resque, :sidekiq, :delayed_job, :queue_classic
|
41
42
|
Devise::Async.backend = :resque
|
42
43
|
```
|
43
44
|
|
@@ -52,9 +53,12 @@ Set `Devise::Async::Proxy` as Devise's mailer in `config/initializers/devise.rb`
|
|
52
53
|
config.mailer = "Devise::Async::Proxy"
|
53
54
|
```
|
54
55
|
|
55
|
-
|
56
|
+
WARNING 1: before devise 2.1.1 devise-async had issues with background jobs trying to run
|
56
57
|
before the record was committed to the DB if the creation was transactioned.
|
57
58
|
|
59
|
+
WARNING 2: I intend to deprecate support for devise < 2.1.1 before 1.0.0 and drop support
|
60
|
+
in the 1.0.0 release. Please consider upgrading your Devise version.
|
61
|
+
|
58
62
|
## Advanced Options
|
59
63
|
|
60
64
|
### Custom mailer class
|
@@ -69,8 +73,8 @@ Devise::Async.mailer = "MyCustomMailer"
|
|
69
73
|
|
70
74
|
### Custom queue
|
71
75
|
|
72
|
-
Let you specify a custom queue where to enqueue your background Devise jobs.
|
73
|
-
|
76
|
+
Let you specify a custom queue where to enqueue your background Devise jobs.
|
77
|
+
Defaults to :mailer.
|
74
78
|
|
75
79
|
```ruby
|
76
80
|
# config/initializers/devise_async.rb
|
@@ -91,6 +95,14 @@ Devise::Async.setup do |config|
|
|
91
95
|
end
|
92
96
|
```
|
93
97
|
|
98
|
+
## Testing
|
99
|
+
|
100
|
+
Be aware that since version 0.3.0 devise-async enqueues the background job in active
|
101
|
+
record's `after_commit` hook. If you're using rspec's `use_transactional_fixtures` the jobs
|
102
|
+
might not be enqueued as you'd expect.
|
103
|
+
|
104
|
+
More details in this stackoverflow [thread](http://stackoverflow.com/questions/13406248/how-do-i-get-devise-async-working-with-cucumber/13465089#13465089).
|
105
|
+
|
94
106
|
## Contributing
|
95
107
|
|
96
108
|
1. Fork it
|
data/devise-async.gemspec
CHANGED
@@ -4,8 +4,8 @@ require File.expand_path('../lib/devise/async/version', __FILE__)
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.authors = ["Marcelo Silveira"]
|
6
6
|
gem.email = ["marcelo@mhfs.com.br"]
|
7
|
-
gem.description = %q{Send Devise's emails in background. Supports Resque, Sidekiq
|
8
|
-
gem.summary = %q{Devise Async provides an easy way to configure Devise to send its emails asynchronously using your preferred queuing backend. It supports Resque, Sidekiq
|
7
|
+
gem.description = %q{Send Devise's emails in background. Supports Resque, Sidekiq, Delayed::Job and QueueClassic.}
|
8
|
+
gem.summary = %q{Devise Async provides an easy way to configure Devise to send its emails asynchronously using your preferred queuing backend. It supports Resque, Sidekiq, Delayed::Job and QueueClassic.}
|
9
9
|
gem.homepage = "https://github.com/mhfs/devise-async/"
|
10
10
|
|
11
11
|
gem.files = `git ls-files`.split($\)
|
@@ -24,6 +24,7 @@ Gem::Specification.new do |gem|
|
|
24
24
|
gem.add_development_dependency "resque", "~> 1.20"
|
25
25
|
gem.add_development_dependency "sidekiq", "~> 1.2"
|
26
26
|
gem.add_development_dependency "delayed_job_active_record", "~> 0.3"
|
27
|
+
gem.add_development_dependency "queue_classic", "~> 2.0"
|
27
28
|
gem.add_development_dependency "mocha", "~> 0.11"
|
28
29
|
gem.add_development_dependency "minitest", "~> 3.0"
|
29
30
|
end
|
data/lib/devise/async.rb
CHANGED
@@ -9,10 +9,11 @@ module Devise
|
|
9
9
|
autoload :Model, "devise/async/model"
|
10
10
|
|
11
11
|
module Backend
|
12
|
-
autoload :Base,
|
13
|
-
autoload :Resque,
|
14
|
-
autoload :Sidekiq,
|
15
|
-
autoload :DelayedJob,
|
12
|
+
autoload :Base, "devise/async/backend/base"
|
13
|
+
autoload :Resque, "devise/async/backend/resque"
|
14
|
+
autoload :Sidekiq, "devise/async/backend/sidekiq"
|
15
|
+
autoload :DelayedJob, "devise/async/backend/delayed_job"
|
16
|
+
autoload :QueueClassic, "devise/async/backend/queue_classic"
|
16
17
|
end
|
17
18
|
|
18
19
|
# Defines the queue backend to be used. Resque by default.
|
@@ -33,7 +34,8 @@ module Devise
|
|
33
34
|
#
|
34
35
|
# Devise::Async.setup do |config|
|
35
36
|
# config.backend = :resque
|
36
|
-
# config.mailer
|
37
|
+
# config.mailer = "MyMailer"
|
38
|
+
# config.queue = :my_custom_queue
|
37
39
|
# end
|
38
40
|
def self.setup
|
39
41
|
yield self
|
@@ -41,20 +43,5 @@ module Devise
|
|
41
43
|
end
|
42
44
|
end
|
43
45
|
|
44
|
-
#
|
45
|
-
# TODO remove when appropriate
|
46
|
-
module DeviseAsync
|
47
|
-
class Proxy < Devise::Async::Proxy
|
48
|
-
def initialize(method, resource)
|
49
|
-
puts "DEPRECATION WARNING: DeviseAsync::Proxy has been deprecated. Please use Devise::Async::Proxy."
|
50
|
-
super
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.backend=(value)
|
55
|
-
puts "DEPRECATION WARNING: `DeviseAsync.backend=` has been deprecated. Please use `Devise::Async.backend=`."
|
56
|
-
Devise::Async.backend = value
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
46
|
+
# Register devise-async model in Devise
|
60
47
|
Devise.add_module(:async, :model => 'devise/async/model')
|
data/lib/devise/async/backend.rb
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
require "queue_classic"
|
2
|
+
|
3
|
+
module Devise
|
4
|
+
module Async
|
5
|
+
module Backend
|
6
|
+
class QueueClassic < Base
|
7
|
+
def self.enqueue(method, *args)
|
8
|
+
queue = ::QC::Queue.new(Devise::Async.queue)
|
9
|
+
method = String(method) # QC won't serialize Symbol such as #{method}
|
10
|
+
args.unshift("#{self}.perform", method)
|
11
|
+
queue.enqueue(*args)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.perform(method, resource_class, resource_id)
|
15
|
+
new.perform(method, resource_class, resource_id)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/devise/async/model.rb
CHANGED
@@ -15,6 +15,13 @@ module Devise
|
|
15
15
|
extend ActiveSupport::Concern
|
16
16
|
|
17
17
|
included do
|
18
|
+
# Register hook to send all devise pending notifications.
|
19
|
+
#
|
20
|
+
# When supported by the ORM/database we send just after commit to
|
21
|
+
# prevent the backend of trying to fetch the record and send the
|
22
|
+
# notification before the record is committed to the databse.
|
23
|
+
#
|
24
|
+
# Otherwise we use after_save.
|
18
25
|
if respond_to?(:after_commit) # AR only
|
19
26
|
after_commit :send_devise_pending_notifications
|
20
27
|
else # mongoid
|
@@ -24,14 +31,23 @@ module Devise
|
|
24
31
|
|
25
32
|
protected
|
26
33
|
|
34
|
+
# This method overwrites devise's own `send_devise_notification`
|
35
|
+
# to capture all email notifications and enqueue it for background
|
36
|
+
# processing instead of sending it inline as devise does by
|
37
|
+
# default.
|
27
38
|
def send_devise_notification(notification)
|
39
|
+
# If the record is dirty we keep pending notifications to be enqueued
|
40
|
+
# by the callback and avoid before commit job processing.
|
28
41
|
if changed?
|
29
42
|
devise_pending_notifications << notification
|
43
|
+
# If the record isn't dirty (aka has already been saved) enqueue right away
|
44
|
+
# because the callback has already been triggered.
|
30
45
|
else
|
31
46
|
Devise::Async::Worker.enqueue(notification, self.class.name, self.id.to_s)
|
32
47
|
end
|
33
48
|
end
|
34
49
|
|
50
|
+
# Send all pending notifications.
|
35
51
|
def send_devise_pending_notifications
|
36
52
|
devise_pending_notifications.each do |notification|
|
37
53
|
# Use `id.to_s` to avoid problems with mongoid 2.4.X ids being serialized
|
data/lib/devise/async/proxy.rb
CHANGED
data/lib/devise/async/version.rb
CHANGED
data/lib/devise/async/worker.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module Devise
|
2
2
|
module Async
|
3
3
|
class Worker
|
4
|
+
# Used is the internal interface for devise-async to enqueue notifications
|
5
|
+
# to the desired backend.
|
4
6
|
def self.enqueue(method, resource_class, resource_id)
|
5
7
|
backend_class.enqueue(method, resource_class, resource_id)
|
6
8
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Devise
|
4
|
+
module Async
|
5
|
+
module Backend
|
6
|
+
describe "QueueClassic" do
|
7
|
+
it "enqueues job" do
|
8
|
+
::QC::Queue.any_instance.expects(:enqueue).with(
|
9
|
+
"Devise::Async::Backend::QueueClassic.perform",
|
10
|
+
"mailer_method", "User", 123)
|
11
|
+
QueueClassic.enqueue(:mailer_method, "User", 123)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "delegates to devise mailer when delivering" do
|
15
|
+
user = create_user
|
16
|
+
ActionMailer::Base.deliveries = []
|
17
|
+
Backend::QueueClassic.perform(:confirmation_instructions, "User", user.id)
|
18
|
+
ActionMailer::Base.deliveries.size.must_equal 1
|
19
|
+
end
|
20
|
+
|
21
|
+
it "enqueues to configured queue" do
|
22
|
+
queue = mock(:enqueue => nil)
|
23
|
+
::QC::Queue.expects(:new).with(:custom_queue).once.returns(queue)
|
24
|
+
QueueClassic.enqueue(:mailer_method, "User", 123)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -15,6 +15,10 @@ module Devise
|
|
15
15
|
Backend.for(:delayed_job).must_equal Backend::DelayedJob
|
16
16
|
end
|
17
17
|
|
18
|
+
it "gives queue classic as the backend" do
|
19
|
+
Backend.for(:queue_classic).must_equal Backend::QueueClassic
|
20
|
+
end
|
21
|
+
|
18
22
|
it "alerts about unsupported backend" do
|
19
23
|
assert_raises ArgumentError do
|
20
24
|
Backend.for(:unsupported_backend)
|
@@ -23,6 +23,13 @@ module Devise
|
|
23
23
|
Backend::DelayedJob.expects(:enqueue).with(:mailer_method, "User", 123)
|
24
24
|
Worker.enqueue(:mailer_method, "User", 123)
|
25
25
|
end
|
26
|
+
|
27
|
+
it "enqueues job using the queue classic backend" do
|
28
|
+
Devise::Async.backend = :queue_classic
|
29
|
+
|
30
|
+
Backend::QueueClassic.expects(:enqueue).with(:mailer_method, "User", 123)
|
31
|
+
Worker.enqueue(:mailer_method, "User", 123)
|
32
|
+
end
|
26
33
|
end
|
27
34
|
end
|
28
35
|
end
|
@@ -7,6 +7,7 @@ Devise.setup do |config|
|
|
7
7
|
config.mailer_sender = "please-change-me-at-config-initializers-devise@example.com"
|
8
8
|
|
9
9
|
# Configure the class responsible to send e-mails.
|
10
|
+
# config.mailer = "Devise::Mailer"
|
10
11
|
config.mailer = "Devise::Async::Proxy"
|
11
12
|
|
12
13
|
# ==> ORM configuration
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devise-async
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: devise
|
@@ -139,6 +139,22 @@ dependencies:
|
|
139
139
|
- - ~>
|
140
140
|
- !ruby/object:Gem::Version
|
141
141
|
version: '0.3'
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: queue_classic
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ~>
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '2.0'
|
150
|
+
type: :development
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ~>
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '2.0'
|
142
158
|
- !ruby/object:Gem::Dependency
|
143
159
|
name: mocha
|
144
160
|
requirement: !ruby/object:Gem::Requirement
|
@@ -171,7 +187,8 @@ dependencies:
|
|
171
187
|
- - ~>
|
172
188
|
- !ruby/object:Gem::Version
|
173
189
|
version: '3.0'
|
174
|
-
description: Send Devise's emails in background. Supports Resque, Sidekiq
|
190
|
+
description: Send Devise's emails in background. Supports Resque, Sidekiq, Delayed::Job
|
191
|
+
and QueueClassic.
|
175
192
|
email:
|
176
193
|
- marcelo@mhfs.com.br
|
177
194
|
executables: []
|
@@ -191,6 +208,7 @@ files:
|
|
191
208
|
- lib/devise/async/backend.rb
|
192
209
|
- lib/devise/async/backend/base.rb
|
193
210
|
- lib/devise/async/backend/delayed_job.rb
|
211
|
+
- lib/devise/async/backend/queue_classic.rb
|
194
212
|
- lib/devise/async/backend/resque.rb
|
195
213
|
- lib/devise/async/backend/sidekiq.rb
|
196
214
|
- lib/devise/async/model.rb
|
@@ -199,6 +217,7 @@ files:
|
|
199
217
|
- lib/devise/async/worker.rb
|
200
218
|
- test/devise/async/backend/base_test.rb
|
201
219
|
- test/devise/async/backend/delayed_job_test.rb
|
220
|
+
- test/devise/async/backend/queue_classic_test.rb
|
202
221
|
- test/devise/async/backend/resque_test.rb
|
203
222
|
- test/devise/async/backend/sidekiq_test.rb
|
204
223
|
- test/devise/async/backend_test.rb
|
@@ -232,7 +251,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
232
251
|
version: '0'
|
233
252
|
segments:
|
234
253
|
- 0
|
235
|
-
hash: -
|
254
|
+
hash: -1534184390293388048
|
236
255
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
237
256
|
none: false
|
238
257
|
requirements:
|
@@ -241,18 +260,19 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
241
260
|
version: '0'
|
242
261
|
segments:
|
243
262
|
- 0
|
244
|
-
hash: -
|
263
|
+
hash: -1534184390293388048
|
245
264
|
requirements: []
|
246
265
|
rubyforge_project:
|
247
266
|
rubygems_version: 1.8.23
|
248
267
|
signing_key:
|
249
268
|
specification_version: 3
|
250
269
|
summary: Devise Async provides an easy way to configure Devise to send its emails
|
251
|
-
asynchronously using your preferred queuing backend. It supports Resque, Sidekiq
|
252
|
-
|
270
|
+
asynchronously using your preferred queuing backend. It supports Resque, Sidekiq,
|
271
|
+
Delayed::Job and QueueClassic.
|
253
272
|
test_files:
|
254
273
|
- test/devise/async/backend/base_test.rb
|
255
274
|
- test/devise/async/backend/delayed_job_test.rb
|
275
|
+
- test/devise/async/backend/queue_classic_test.rb
|
256
276
|
- test/devise/async/backend/resque_test.rb
|
257
277
|
- test/devise/async/backend/sidekiq_test.rb
|
258
278
|
- test/devise/async/backend_test.rb
|