qc-mailer 0.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.
- data/.gitignore +17 -0
- data/.rvmrc +2 -0
- data/.travis.yml +17 -0
- data/Gemfile +4 -0
- data/README.md +53 -0
- data/Rakefile +12 -0
- data/lib/qc-mailer/message_decoy.rb +33 -0
- data/lib/qc-mailer/version.rb +5 -0
- data/lib/qc-mailer.rb +47 -0
- data/qc-mailer.gemspec +28 -0
- data/test/qc_mailer_test.rb +101 -0
- data/test/support/qc_helper.rb +31 -0
- data/test/test_helper.rb +20 -0
- metadata +195 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
language: ruby
|
2
|
+
|
3
|
+
notifications:
|
4
|
+
email: false
|
5
|
+
webhooks:
|
6
|
+
on_success: always
|
7
|
+
on_failure: always
|
8
|
+
|
9
|
+
rvm:
|
10
|
+
- 1.9.2
|
11
|
+
- 1.9.3
|
12
|
+
|
13
|
+
script: bundle exec rake test
|
14
|
+
|
15
|
+
before_script:
|
16
|
+
- psql -c 'create database queue_classic_test;' -U postgres
|
17
|
+
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
QueueClassic Mailer
|
2
|
+
==================
|
3
|
+
|
4
|
+
Add to a Rails 3.x project to send email in the background using QueueClassic.
|
5
|
+
|
6
|
+
This gem was inspired by ResqueMailer, https://github.com/zapnap/resque_mailer
|
7
|
+
|
8
|
+
**WARNING: USE AT OWN RISK! THIS GEM IS CONSIDERED EXTREME ALPHA!**
|
9
|
+
|
10
|
+
[](http://travis-ci.org/zerobearing2/qc-mailer)
|
11
|
+
|
12
|
+
Usage
|
13
|
+
-----
|
14
|
+
|
15
|
+
Install as gem
|
16
|
+
|
17
|
+
gem install qc-mailer
|
18
|
+
|
19
|
+
Add to Gemfile
|
20
|
+
|
21
|
+
gem "qc-mailer"
|
22
|
+
|
23
|
+
Include QC::Mailer in your ActionMailer subclass(es) like this:
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
class MyMailer < ActionMailer::Base
|
27
|
+
include QC::Mailer
|
28
|
+
end
|
29
|
+
```
|
30
|
+
|
31
|
+
Now, when ```MyMailer.subject_email(params).deliver``` is called, an entry will be created in the job queue.
|
32
|
+
|
33
|
+
Note that you can still have mail delivered synchronously by using the bang method variant:
|
34
|
+
```ruby
|
35
|
+
MyMailer.subject_email(params).deliver!
|
36
|
+
```
|
37
|
+
|
38
|
+
If you want to set a different default queue name for your mailer, you can change the default_queue property like so:
|
39
|
+
```ruby
|
40
|
+
# config/initializers/qc_mailer.rb
|
41
|
+
QC::Mailer.default_queue = 'application_specific_mailer'
|
42
|
+
```
|
43
|
+
|
44
|
+
TODO
|
45
|
+
----
|
46
|
+
|
47
|
+
- TBD
|
48
|
+
|
49
|
+
|
50
|
+
Meta
|
51
|
+
----
|
52
|
+
|
53
|
+
Released under the [MIT license](http://www.opensource.org/licenses/mit-license.php).
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
require 'rake/testtask'
|
4
|
+
|
5
|
+
task :default => [:test]
|
6
|
+
|
7
|
+
Rake::TestTask.new do |t|
|
8
|
+
t.libs.push "lib"
|
9
|
+
t.test_files = FileList[File.expand_path('../test/**/*_test.rb', __FILE__)]
|
10
|
+
t.verbose = true
|
11
|
+
end
|
12
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "queue_classic"
|
2
|
+
|
3
|
+
module QC
|
4
|
+
module Mailer
|
5
|
+
|
6
|
+
class MessageDecoy
|
7
|
+
delegate :to_s, :to => :actual_message
|
8
|
+
|
9
|
+
def initialize(mailer_class, method_name, *args)
|
10
|
+
@mailer_class = mailer_class
|
11
|
+
@method_name = method_name.to_s
|
12
|
+
*@args = *args
|
13
|
+
end
|
14
|
+
|
15
|
+
def actual_message
|
16
|
+
@actual_message ||= @mailer_class.send(:new, @method_name, *@args).message
|
17
|
+
end
|
18
|
+
|
19
|
+
def deliver
|
20
|
+
@mailer_class.queue.enqueue("#{@mailer_class}.deliver", @method_name, *@args)
|
21
|
+
end
|
22
|
+
|
23
|
+
def deliver!
|
24
|
+
actual_message.deliver
|
25
|
+
end
|
26
|
+
|
27
|
+
def method_missing(method_name, *args)
|
28
|
+
actual_message.send(method_name, *args)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
data/lib/qc-mailer.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require "active_support/concern"
|
2
|
+
require "qc-mailer/version"
|
3
|
+
require "qc-mailer/message_decoy"
|
4
|
+
|
5
|
+
module QC
|
6
|
+
module Mailer
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
extend(ClassMethods)
|
11
|
+
end
|
12
|
+
|
13
|
+
# ModuleMethods
|
14
|
+
mattr_accessor :default_queue
|
15
|
+
def self.default_queue
|
16
|
+
@@default_queue || QC::QUEUE || "default"
|
17
|
+
end
|
18
|
+
|
19
|
+
# ClassMethods
|
20
|
+
module ClassMethods
|
21
|
+
def queue_name
|
22
|
+
@queue_name || QC::Mailer.default_queue
|
23
|
+
end
|
24
|
+
|
25
|
+
def queue_name=(val)
|
26
|
+
@queue_name = val
|
27
|
+
end
|
28
|
+
|
29
|
+
def queue
|
30
|
+
@queue ||= QC::Queue.new(queue_name)
|
31
|
+
end
|
32
|
+
|
33
|
+
def deliver(method, *args)
|
34
|
+
send(method, *args).deliver!
|
35
|
+
end
|
36
|
+
|
37
|
+
def method_missing(method_name, *args)
|
38
|
+
if action_methods.include?(method_name.to_s)
|
39
|
+
MessageDecoy.new(self, method_name, *args)
|
40
|
+
else
|
41
|
+
super
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
data/qc-mailer.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/qc-mailer/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["David Bradford"]
|
6
|
+
gem.email = ["david@zerobearing.com"]
|
7
|
+
gem.description = %q{Rails plugin for sending asynchronous email with ActionMailer and QueueClassic.}
|
8
|
+
gem.summary = %q{Rails plugin for sending asynchronous email with ActionMailer and QueueClassic.}
|
9
|
+
gem.homepage = "https://github.com/zerobearing2/qc-mailer"
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "qc-mailer"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = QC::Mailer::VERSION
|
17
|
+
|
18
|
+
# specify any dependencies here; for example:
|
19
|
+
gem.add_runtime_dependency "activesupport", "~> 3.0"
|
20
|
+
gem.add_runtime_dependency "actionmailer", "~> 3.0"
|
21
|
+
gem.add_runtime_dependency "i18n", "~> 0.6.0"
|
22
|
+
gem.add_runtime_dependency "queue_classic", "~> 2.0.1"
|
23
|
+
|
24
|
+
gem.add_development_dependency "minitest", "~> 3.3.0"
|
25
|
+
gem.add_development_dependency "minitest-reporters"
|
26
|
+
gem.add_development_dependency 'rake'
|
27
|
+
gem.add_development_dependency "pry"
|
28
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require_relative "./test_helper"
|
2
|
+
|
3
|
+
class Rails3Mailer < ActionMailer::Base
|
4
|
+
include QC::Mailer
|
5
|
+
default :from => "from@example.org", :subject => "Subject"
|
6
|
+
|
7
|
+
def test_mail(*params)
|
8
|
+
mail(*params)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class PriorityMailer < Rails3Mailer
|
13
|
+
self.queue_name = 'priority-mailer'
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
describe 'QC::Mailer' do
|
18
|
+
include QCHelper
|
19
|
+
|
20
|
+
before do
|
21
|
+
ActionMailer::Base.deliveries = []
|
22
|
+
@test_mail = Rails3Mailer.test_mail( 'to' => "testme@example.org" )
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "default_queue" do
|
26
|
+
it "should be 'default'" do
|
27
|
+
QC::Mailer.default_queue.must_equal("default")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "queue_name" do
|
32
|
+
before do
|
33
|
+
QC::Mailer.default_queue = nil
|
34
|
+
Rails3Mailer.queue_name = nil
|
35
|
+
end
|
36
|
+
|
37
|
+
it "allows overriding of the default queue target" do
|
38
|
+
QC::Mailer.default_queue = "my-queue"
|
39
|
+
Rails3Mailer.queue_name.must_equal("my-queue")
|
40
|
+
end
|
41
|
+
|
42
|
+
it "set queue_name manually" do
|
43
|
+
Rails3Mailer.queue_name = "testing"
|
44
|
+
Rails3Mailer.queue_name.must_equal("testing")
|
45
|
+
end
|
46
|
+
|
47
|
+
it "set at class level" do
|
48
|
+
QC::Mailer.default_queue.must_equal("default")
|
49
|
+
Rails3Mailer.queue_name.must_equal("default")
|
50
|
+
PriorityMailer.queue_name.must_equal('priority-mailer')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "queue" do
|
55
|
+
it "should be a QC::Queue" do
|
56
|
+
Rails3Mailer.queue.must_be_instance_of(QC::Queue)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '#deliver' do
|
61
|
+
it 'should not deliver the email synchronously' do
|
62
|
+
@test_mail.deliver
|
63
|
+
ActionMailer::Base.deliveries.must_be_empty
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should place the deliver action on the QC "mailer" queue' do
|
67
|
+
Rails3Mailer.queue.count.must_equal(0)
|
68
|
+
@test_mail.deliver
|
69
|
+
Rails3Mailer.queue.count.must_equal(1)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "#deliver job" do
|
74
|
+
it "should process the job" do
|
75
|
+
Rails3Mailer.queue.stub(:enqueue, enqueue_stub) do
|
76
|
+
ActionMailer::Base.deliveries.must_be_empty
|
77
|
+
@test_mail.deliver
|
78
|
+
ActionMailer::Base.deliveries.wont_be_empty
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe '#deliver!' do
|
84
|
+
it "should send synchronously" do
|
85
|
+
@test_mail.deliver!
|
86
|
+
ActionMailer::Base.deliveries.wont_be_empty
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe 'original mail methods' do
|
91
|
+
it 'should be preserved' do
|
92
|
+
@test_mail.subject.must_equal 'Subject'
|
93
|
+
@test_mail.from.must_include 'from@example.org'
|
94
|
+
@test_mail.to.must_include 'testme@example.org'
|
95
|
+
end
|
96
|
+
|
97
|
+
it "to_s should have Content-Type" do
|
98
|
+
@test_mail.to_s.must_include "Content-Type:"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module QCHelper
|
2
|
+
|
3
|
+
def setup
|
4
|
+
init_db
|
5
|
+
silence_logger
|
6
|
+
end
|
7
|
+
|
8
|
+
def teardown
|
9
|
+
QC.delete_all
|
10
|
+
end
|
11
|
+
|
12
|
+
def silence_logger
|
13
|
+
QC.define_singleton_method :log do |*args| nil; end # silence QC logger
|
14
|
+
end
|
15
|
+
|
16
|
+
def init_db(table_name="queue_classic_jobs")
|
17
|
+
QC::Conn.execute("SET client_min_messages TO 'warning'")
|
18
|
+
QC::Setup.drop
|
19
|
+
QC::Setup.create
|
20
|
+
QC::Conn.disconnect
|
21
|
+
end
|
22
|
+
|
23
|
+
def enqueue_stub
|
24
|
+
proc do |method, *args|
|
25
|
+
klass = eval(method.split(".").first)
|
26
|
+
msg = method.split(".").last
|
27
|
+
klass.send(msg, *args)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# test/test_helper.rb
|
2
|
+
|
3
|
+
ENV["TEST"] = 'true'
|
4
|
+
ENV["DATABASE_URL"] ||= "postgres:///queue_classic_test"
|
5
|
+
|
6
|
+
$:.unshift File.expand_path("../../lib")
|
7
|
+
require 'rubygems'
|
8
|
+
require 'minitest/autorun'
|
9
|
+
require "minitest/reporters"
|
10
|
+
require 'pry'
|
11
|
+
require 'time'
|
12
|
+
require 'action_mailer'
|
13
|
+
require 'qc-mailer'
|
14
|
+
|
15
|
+
MiniTest::Reporters.use! [MiniTest::Reporters::SpecReporter.new]
|
16
|
+
|
17
|
+
ActionMailer::Base.delivery_method = :test
|
18
|
+
# ActionMailer::Base.perform_deliveries = false
|
19
|
+
|
20
|
+
Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each {|f| require f}
|
metadata
ADDED
@@ -0,0 +1,195 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: qc-mailer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- David Bradford
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-08-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: actionmailer
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '3.0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '3.0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: i18n
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.6.0
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.6.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: queue_classic
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.0.1
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 2.0.1
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: minitest
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 3.3.0
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 3.3.0
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: minitest-reporters
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: rake
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: pry
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
description: Rails plugin for sending asynchronous email with ActionMailer and QueueClassic.
|
143
|
+
email:
|
144
|
+
- david@zerobearing.com
|
145
|
+
executables: []
|
146
|
+
extensions: []
|
147
|
+
extra_rdoc_files: []
|
148
|
+
files:
|
149
|
+
- .gitignore
|
150
|
+
- .rvmrc
|
151
|
+
- .travis.yml
|
152
|
+
- Gemfile
|
153
|
+
- README.md
|
154
|
+
- Rakefile
|
155
|
+
- lib/qc-mailer.rb
|
156
|
+
- lib/qc-mailer/message_decoy.rb
|
157
|
+
- lib/qc-mailer/version.rb
|
158
|
+
- qc-mailer.gemspec
|
159
|
+
- test/qc_mailer_test.rb
|
160
|
+
- test/support/qc_helper.rb
|
161
|
+
- test/test_helper.rb
|
162
|
+
homepage: https://github.com/zerobearing2/qc-mailer
|
163
|
+
licenses: []
|
164
|
+
post_install_message:
|
165
|
+
rdoc_options: []
|
166
|
+
require_paths:
|
167
|
+
- lib
|
168
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ! '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
segments:
|
175
|
+
- 0
|
176
|
+
hash: -851662944801137892
|
177
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
178
|
+
none: false
|
179
|
+
requirements:
|
180
|
+
- - ! '>='
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: '0'
|
183
|
+
segments:
|
184
|
+
- 0
|
185
|
+
hash: -851662944801137892
|
186
|
+
requirements: []
|
187
|
+
rubyforge_project:
|
188
|
+
rubygems_version: 1.8.24
|
189
|
+
signing_key:
|
190
|
+
specification_version: 3
|
191
|
+
summary: Rails plugin for sending asynchronous email with ActionMailer and QueueClassic.
|
192
|
+
test_files:
|
193
|
+
- test/qc_mailer_test.rb
|
194
|
+
- test/support/qc_helper.rb
|
195
|
+
- test/test_helper.rb
|