backburner_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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4f3d25f31dcf7eced42eebafe8bcabf23e236e3e
4
+ data.tar.gz: 95c6e125cd82317ebffcf47514a04c2b23bb3de1
5
+ SHA512:
6
+ metadata.gz: 46de06c89f64c4b1cb6c56a71724b97c6e30460e22c377e030942cfcd184aa37196518095472873be8d433a11cc8336aee50d59302407915e266757577c6c5f6
7
+ data.tar.gz: ffe70fd203ca8fc943d326cf9206ef7cab3f97fef25d5163784a4fdbd90cf251ca7ac43154002916e56714367ea3ef7f950e91a1fccab764b3d96a0fc2d63c0f
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in backburner_mailer.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Nathan Esquenazi
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,105 @@
1
+ # BackburnerMailer
2
+
3
+ A gem plugin which allows messages prepared by ActionMailer or Padrino Mailer to be delivered
4
+ asynchronously. Assumes you're using Backburner (http://github.com/nesquena/backburner)
5
+ for your background jobs.
6
+
7
+ Note that Backburner::Mailer only works with Rails 3.x and Padrino.
8
+
9
+ This was **heavily** inspired by and largely adapted from [resque-mailer](https://github.com/zapnap/resque_mailer).
10
+ Most of the credit goes to them, this is a minor adaptation to support backburner.
11
+
12
+ ## Usage
13
+
14
+ Include Backburner::Mailer in your ActionMailer subclass(es) like this:
15
+
16
+ ```ruby
17
+ class MyMailer < ActionMailer::Base
18
+ include Backburner::Mailer
19
+ end
20
+ ```
21
+
22
+ Now, when `MyMailer.subject_email(params).deliver` is called, an entry
23
+ will be created in the job queue. Your Backburner workers will be able to deliver
24
+ this message for you. The queue we're using is named +mailer+,
25
+ so just make sure your workers know about it and are loading your environment:
26
+
27
+ ```bash
28
+ QUEUE=mailer bundle exec rake backburner:work
29
+ ```
30
+
31
+ Note that you can still have mail delivered synchronously by using the bang
32
+ method variant:
33
+
34
+ ```ruby
35
+ MyMailer.subject_email(params).deliver!
36
+ ```
37
+
38
+ Oh, by the way. Don't forget that **your async mailer jobs will be processed by
39
+ a separate worker**. This means that you should resist the temptation to pass
40
+ database-backed objects as parameters in your mailer and instead pass record
41
+ identifiers. Then, in your delivery method, you can look up the record from
42
+ the id and use it as needed.
43
+
44
+ If you want to set a different default queue name for your mailer, you can
45
+ change the `default_queue_name` property like so:
46
+
47
+ ```ruby
48
+ # config/initializers/backburner_mailer.rb
49
+ Backburner::Mailer.default_queue_name = 'application_specific_mailer'
50
+ ```
51
+
52
+ This is useful when you are running more than one application using
53
+ backburner_mailer in a shared environment. You will need to use the new queue
54
+ name when starting your workers.
55
+
56
+ ```bash
57
+ QUEUE=application_specific_mailer bundle exec rake backburner:work
58
+ ```
59
+
60
+ Custom handling of errors that arise when sending a message is possible by
61
+ assigning a lambda to the `error_hander` attribute.
62
+
63
+ ```ruby
64
+ Backburner::Mailer.error_handler = lambda { |mailer, message, error|
65
+ # some custom error handling code here in which you optionally re-raise the error
66
+ }
67
+ ```
68
+
69
+ ## Installation
70
+
71
+ Install the gem:
72
+
73
+ gem install backburner_mailer
74
+
75
+ If you're using Bundler to manage your dependencies, you should add it to your Gemfile:
76
+
77
+ gem 'backburner'
78
+ gem 'backburner_mailer'
79
+
80
+ ## Testing
81
+
82
+ You don't want to be sending actual emails in the test environment, so you can
83
+ configure the environments that should be excluded like so:
84
+
85
+ # config/initializers/backburner_mailer.rb
86
+ Backburner::Mailer.excluded_environments = [:test, :cucumber]
87
+
88
+ Note: Define `current_env` if using Backburner::Mailer in a non-Rails or non-Padrino project:
89
+
90
+ Backburner::Mailer.current_env = :production
91
+
92
+ ## Note on Patches / Pull Requests
93
+
94
+ * Fork the project.
95
+ * Make your feature addition or bug fix.
96
+ * Add tests for it. This is important so I don't break it in a future version unintentionally.
97
+ * Commit, do not mess with rakefile, version, or history.
98
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
99
+ * Send me a pull request. Bonus points for topic branches.
100
+
101
+ ## Credits
102
+
103
+ Developed by Nathan Esquenazi.
104
+ Shamelessly adapted from [resque-mailer](https://github.com/zapnap/resque_mailer).
105
+ Code originally developed by Nick Plante with help from a number of [contributors](https://github.com/zapnap/resque_mailer/contributors).
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec) do |spec|
6
+ spec.pattern = ["spec/backburner_mailer_spec.rb"]
7
+ end
8
+
9
+ task :default => :spec
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'backburner_mailer/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "backburner_mailer"
8
+ spec.version = BackburnerMailer::VERSION
9
+ spec.authors = ["Nathan Esquenazi"]
10
+ spec.email = ["nesquena@gmail.com"]
11
+ spec.description = %q{Plugin for sending asynchronous email with Backburner}
12
+ spec.summary = %q{Plugin for sending asynchronous email with Backburner.}
13
+ spec.homepage = "https://github.com/nesquena/backburner_mailer"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency "backburner"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.3"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "actionmailer", "~> 3"
26
+ spec.add_development_dependency("rspec", "~> 2.6")
27
+ spec.add_development_dependency("yard", ">= 0.6.0")
28
+ end
@@ -0,0 +1,138 @@
1
+ require "backburner_mailer/version"
2
+
3
+ module Backburner
4
+ module Mailer
5
+ class << self
6
+ attr_accessor :default_queue_name, :default_queue_target, :current_env, :logger, :fallback_to_synchronous, :error_handler
7
+ attr_reader :excluded_environments
8
+
9
+ def excluded_environments=(envs)
10
+ @excluded_environments = [*envs].map { |e| e.to_sym }
11
+ end
12
+
13
+ def included(base)
14
+ base.send(:include, Backburner::Queue)
15
+ base.extend(ClassMethods)
16
+ end
17
+ end
18
+
19
+ self.logger = nil
20
+ self.default_queue_target = ::Backburner
21
+ self.default_queue_name = "mailer"
22
+ self.excluded_environments = []
23
+
24
+ module ClassMethods
25
+
26
+ def current_env
27
+ if defined?(Rails)
28
+ ::Backburner::Mailer.current_env || ::Rails.env
29
+ elsif defined?(Padrino)
30
+ ::Backburner::Mailer.current_env || ::Padrino.env
31
+ else
32
+ ::Backburner::Mailer.current_env
33
+ end
34
+ end
35
+
36
+ def method_missing(method_name, *args)
37
+ if action_methods.include?(method_name.to_s)
38
+ MessageDecoy.new(self, method_name, *args)
39
+ else
40
+ super
41
+ end
42
+ end
43
+
44
+ def perform(action, *args)
45
+ begin
46
+ message = self.send(:new, action, *args).message
47
+ message.deliver
48
+ rescue Exception => ex
49
+ if Mailer.error_handler
50
+ Mailer.error_handler.call(self, message, ex)
51
+ else
52
+ if logger
53
+ logger.error "Unable to deliver email [#{action}]: #{ex}"
54
+ logger.error ex.backtrace.join("\n\t")
55
+ end
56
+ raise ex
57
+ end
58
+ end
59
+ end
60
+
61
+ def queue
62
+ @queue || ::Backburner::Mailer.default_queue_name
63
+ end
64
+
65
+ def queue=(name)
66
+ @queue = name
67
+ end
68
+
69
+ def backburner
70
+ ::Backburner::Mailer.default_queue_target
71
+ end
72
+
73
+ def excluded_environment?(name)
74
+ ::Backburner::Mailer.excluded_environments && ::Backburner::Mailer.excluded_environments.include?(name.try(:to_sym))
75
+ end
76
+
77
+ def deliver?
78
+ true
79
+ end
80
+ end
81
+
82
+ class MessageDecoy
83
+ delegate :to_s, :to => :actual_message
84
+
85
+ def initialize(mailer_class, method_name, *args)
86
+ @mailer_class = mailer_class
87
+ @method_name = method_name
88
+ *@args = *args
89
+ end
90
+
91
+ def backburner
92
+ ::Backburner::Mailer.default_queue_target
93
+ end
94
+
95
+ def current_env
96
+ if defined?(Rails)
97
+ ::Backburner::Mailer.current_env || ::Rails.env
98
+ elsif defined?(Padrino)
99
+ ::Backburner::Mailer.current_env || ::Padrino.env
100
+ else
101
+ ::Backburner::Mailer.current_env
102
+ end
103
+ end
104
+
105
+ def environment_excluded?
106
+ !ActionMailer::Base.perform_deliveries || excluded_environment?(current_env)
107
+ end
108
+
109
+ def excluded_environment?(name)
110
+ ::Backburner::Mailer.excluded_environments && ::Backburner::Mailer.excluded_environments.include?(name.to_sym)
111
+ end
112
+
113
+ def actual_message
114
+ @actual_message ||= @mailer_class.send(:new, @method_name, *@args).message
115
+ end
116
+
117
+ def deliver
118
+ return deliver! if environment_excluded?
119
+
120
+ if @mailer_class.deliver?
121
+ begin
122
+ backburner.enqueue(@mailer_class, @method_name, *@args)
123
+ rescue Errno::ECONNREFUSED
124
+ deliver!
125
+ end
126
+ end
127
+ end
128
+
129
+ def deliver!
130
+ actual_message.deliver
131
+ end
132
+
133
+ def method_missing(method_name, *args)
134
+ actual_message.send(method_name, *args)
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,3 @@
1
+ module BackburnerMailer
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,173 @@
1
+ require 'spec_helper'
2
+
3
+ class FakeBackburner
4
+ def self.enqueue(*args); end
5
+ end
6
+
7
+ class Rails3Mailer < ActionMailer::Base
8
+ include Backburner::Mailer
9
+ default :from => "from@example.org", :subject => "Subject"
10
+ MAIL_PARAMS = { :to => "crafty@example.org" }
11
+
12
+ def test_mail(*params)
13
+ Backburner::Mailer.success!
14
+ mail(*params)
15
+ end
16
+ end
17
+
18
+ class PriorityMailer < Rails3Mailer
19
+ self.queue = 'priority_mailer'
20
+ end
21
+
22
+ describe Backburner::Mailer do
23
+ let(:backburner) { FakeBackburner }
24
+
25
+ before do
26
+ Backburner::Mailer.default_queue_target = backburner
27
+ Backburner::Mailer.fallback_to_synchronous = false
28
+ Backburner::Mailer.stub(:success!)
29
+ Backburner::Mailer.stub(:current_env => :test)
30
+ end
31
+
32
+ describe "backburner" do
33
+ it "allows overriding of the default queue target (for testing)" do
34
+ Backburner::Mailer.default_queue_target = FakeBackburner
35
+ Rails3Mailer.backburner.should == FakeBackburner
36
+ end
37
+ end
38
+
39
+ describe "queue" do
40
+ it "defaults to the 'mailer' queue" do
41
+ Rails3Mailer.queue.should == "mailer"
42
+ end
43
+
44
+ it "allows overriding of the default queue name" do
45
+ Backburner::Mailer.default_queue_name = "postal"
46
+ Rails3Mailer.queue.should == "postal"
47
+ end
48
+
49
+ it "allows overriding of the local queue name" do
50
+ PriorityMailer.queue.should == "priority_mailer"
51
+ end
52
+ end
53
+
54
+ describe '#deliver' do
55
+ before(:all) do
56
+ @delivery = lambda {
57
+ Rails3Mailer.test_mail(Rails3Mailer::MAIL_PARAMS).deliver
58
+ }
59
+ end
60
+
61
+ it 'should not deliver the email synchronously' do
62
+ lambda { @delivery.call }.should_not change(ActionMailer::Base.deliveries, :size)
63
+ end
64
+
65
+ it 'should place the deliver action on the Backburner "mailer" queue' do
66
+ backburner.should_receive(:enqueue).with(Rails3Mailer, :test_mail, Rails3Mailer::MAIL_PARAMS)
67
+ @delivery.call
68
+ end
69
+
70
+ context "when current env is excluded" do
71
+ it 'should not deliver through Backburner for excluded environments' do
72
+ Backburner::Mailer.stub(:excluded_environments => [:custom])
73
+ Backburner::Mailer::MessageDecoy.any_instance.should_receive(:current_env).and_return(:custom)
74
+ backburner.should_not_receive(:enqueue)
75
+ @delivery.call
76
+ end
77
+ end
78
+
79
+ it 'should not invoke the method body more than once' do
80
+ Backburner::Mailer.should_not_receive(:success!)
81
+ Rails3Mailer.test_mail(Rails3Mailer::MAIL_PARAMS).deliver
82
+ end
83
+
84
+ context "when fallback_to_synchronous is true" do
85
+ before do
86
+ Backburner::Mailer.fallback_to_synchronous = true
87
+ end
88
+
89
+ context "when redis is not available" do
90
+ before do
91
+ Backburner::Mailer.default_queue_target.stub(:enqueue).and_raise(Errno::ECONNREFUSED)
92
+ end
93
+
94
+ it 'should deliver the email synchronously' do
95
+ lambda { @delivery.call }.should change(ActionMailer::Base.deliveries, :size).by(1)
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ describe '#deliver!' do
102
+ it 'should deliver the email synchronously' do
103
+ lambda { Rails3Mailer.test_mail(Rails3Mailer::MAIL_PARAMS).deliver! }.should change(ActionMailer::Base.deliveries, :size).by(1)
104
+ end
105
+ end
106
+
107
+ describe 'perform' do
108
+ it 'should perform a queued mailer job' do
109
+ lambda {
110
+ Rails3Mailer.perform(:test_mail, Rails3Mailer::MAIL_PARAMS)
111
+ }.should change(ActionMailer::Base.deliveries, :size).by(1)
112
+ end
113
+
114
+ context "when job fails" do
115
+ let(:message) { mock(:message) }
116
+ let(:mailer) { mock(:mailer, :message => message) }
117
+ let(:logger) { mock(:logger, :error => nil) }
118
+ let(:exception) { Exception.new("An error") }
119
+
120
+ before(:each) do
121
+ Backburner::Mailer.error_handler = nil
122
+ Rails3Mailer.logger = logger
123
+ Rails3Mailer.stub(:new) { mailer }
124
+ message.stub(:deliver).and_raise(exception)
125
+ end
126
+
127
+ subject { Rails3Mailer.perform(:test_mail, Rails3Mailer::MAIL_PARAMS) }
128
+
129
+ it "raises and logs the exception" do
130
+ logger.should_receive(:error).at_least(:once)
131
+ expect { subject }.to raise_error
132
+ end
133
+
134
+ context "when error_handler set" do
135
+ before(:each) do
136
+ Backburner::Mailer.error_handler = lambda { |mailer, message, exception|
137
+ @mailer = mailer
138
+ @message = message
139
+ @exception = exception
140
+ }
141
+ end
142
+
143
+ it "should pass the mailer to the handler" do
144
+ subject
145
+ @mailer.should eq(Rails3Mailer)
146
+ end
147
+
148
+ it "should pass the message to the handler" do
149
+ subject
150
+ @message.should eq(message)
151
+ end
152
+
153
+ it "should pass the exception to the handler" do
154
+ subject
155
+ @exception.should eq(exception)
156
+ end
157
+ end
158
+ end
159
+ end
160
+
161
+ describe 'original mail methods' do
162
+ it 'should be preserved' do
163
+ Rails3Mailer.test_mail(Rails3Mailer::MAIL_PARAMS).subject.should == 'Subject'
164
+ Rails3Mailer.test_mail(Rails3Mailer::MAIL_PARAMS).from.should include('from@example.org')
165
+ Rails3Mailer.test_mail(Rails3Mailer::MAIL_PARAMS).to.should include('crafty@example.org')
166
+ end
167
+
168
+ it 'should require execution of the method body prior to queueing' do
169
+ Backburner::Mailer.should_receive(:success!).once
170
+ Rails3Mailer.test_mail(Rails3Mailer::MAIL_PARAMS).subject
171
+ end
172
+ end
173
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,9 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ require 'action_mailer'
5
+ require 'backburner_mailer'
6
+ require 'rspec/autorun'
7
+
8
+ Backburner::Mailer.excluded_environments = []
9
+ ActionMailer::Base.delivery_method = :test
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: backburner_mailer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Nathan Esquenazi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-04-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: backburner
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: actionmailer
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '3'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '2.6'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '2.6'
83
+ - !ruby/object:Gem::Dependency
84
+ name: yard
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: 0.6.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: 0.6.0
97
+ description: Plugin for sending asynchronous email with Backburner
98
+ email:
99
+ - nesquena@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - .gitignore
105
+ - Gemfile
106
+ - LICENSE.txt
107
+ - README.md
108
+ - Rakefile
109
+ - backburner_mailer.gemspec
110
+ - lib/backburner_mailer.rb
111
+ - lib/backburner_mailer/version.rb
112
+ - spec/backburner_mailer_spec.rb
113
+ - spec/spec.opts
114
+ - spec/spec_helper.rb
115
+ homepage: https://github.com/nesquena/backburner_mailer
116
+ licenses:
117
+ - MIT
118
+ metadata: {}
119
+ post_install_message:
120
+ rdoc_options: []
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - '>='
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ required_rubygems_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ requirements: []
134
+ rubyforge_project:
135
+ rubygems_version: 2.0.2
136
+ signing_key:
137
+ specification_version: 4
138
+ summary: Plugin for sending asynchronous email with Backburner.
139
+ test_files:
140
+ - spec/backburner_mailer_spec.rb
141
+ - spec/spec.opts
142
+ - spec/spec_helper.rb
143
+ has_rdoc: