merb-resque-mailer 0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,63 @@
1
+ Merb Resque Mailer
2
+ ==================
3
+
4
+ Plugin for Merb which allows putting mail deliveries onto [Resque](http://github.com/defunkt/resque) queue.
5
+
6
+ Usage
7
+ -----
8
+
9
+ Include Resque::Mailer module in your Merb::MailController subclass(es) like this:
10
+
11
+ class UserMailer < Merb::MailController
12
+ include Resque::Mailer
13
+ ...
14
+ end
15
+
16
+ or directly in Merb::MailController class if you want to enable it for all mailers:
17
+
18
+ class Merb::MailController
19
+ include Resque::Mailer
20
+ ...
21
+ end
22
+
23
+ Jobs are added to "mailer" queue so you should start at least one worker listening on "mailer" queue:
24
+
25
+ QUEUE=mailer rake merb_env resque:work
26
+
27
+ Be sure you have 'resque/tasks' required in your Rakefile (or somewhere in lib/tasks/), it's required for above task to work.
28
+
29
+ From now on all emails will be sent asynchronously using Resque worker(s).
30
+
31
+ Installation
32
+ ------------
33
+
34
+ Gem is hosted on gemcutter.org, simply install it by:
35
+
36
+ gem install merb-resque-mailer
37
+
38
+ and require it in your app:
39
+
40
+ require "merb-resque-mailer"
41
+
42
+ If using bundler add it to Gemfile:
43
+
44
+ gem "merb-resque-mailer"
45
+
46
+ Configuration
47
+ -------------
48
+
49
+ You can configure for which environments you don't want to use Merb Resque Mailer by setting Resque::Mailer.excluded_environments option (by default :test env is excluded). If you want to exclude also :development env put following code somewhere in config/init.rb:
50
+ Resque::Mailer.excluded_environments = [:test, :development]
51
+
52
+ or
53
+
54
+ Resque::Mailer.excluded_environments << :development
55
+
56
+ If you want to put deliveries to other queue than default "mailer" you can set it like this:
57
+
58
+ Resque::Mailer.queue_name = "notifications"
59
+
60
+ Credits
61
+ -------
62
+
63
+ This piece of code was inspired by work of [Nick Plante](http://github.com/zapnap) who created [resque_mailer](http://github.com/zapnap/resque_mailer) for Rails' ActionMailer. Rewritten to work with Merb Mailer by [Marcin Kulik](http://github.com/sickill).
@@ -0,0 +1,44 @@
1
+ require 'resque'
2
+
3
+ module Resque
4
+ module Mailer
5
+
6
+ class << self
7
+ attr_accessor :queue_name
8
+ attr_reader :excluded_environments
9
+ end
10
+
11
+ def self.excluded_environments=(envs)
12
+ @excluded_environments = envs.map { |e| e.to_sym }
13
+ end
14
+
15
+ self.queue_name = "mailer"
16
+ self.excluded_environments = [:test]
17
+
18
+ def self.included(base)
19
+ base.extend(ClassMethods)
20
+ base.class_eval do
21
+ alias_method :dispatch_and_deliver!, :dispatch_and_deliver
22
+
23
+ def dispatch_and_deliver(method, mail_params)
24
+ if ::Resque::Mailer.excluded_environments.include?(Merb.env.to_sym)
25
+ dispatch_and_deliver!(method, mail_params)
26
+ else
27
+ ::Resque.enqueue(self.class, @params, method, mail_params)
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ module ClassMethods
34
+ def queue
35
+ Resque::Mailer.queue_name
36
+ end
37
+
38
+ def perform(params, method, mail_params)
39
+ new(Mash.new(params)).dispatch_and_deliver!(method.to_sym, mail_params)
40
+ end
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,67 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ Resque::Mailer.excluded_environments = []
4
+ Resque::Mailer.queue_name = "foobar"
5
+
6
+ class TestMailer < Merb::MailController
7
+ include Resque::Mailer
8
+
9
+ ACTION_PARAMS = {}
10
+ MAILER_PARAMS = { :from => "jola@example.org", :to => "misio@example.org", :subject => "Friendship established" }
11
+
12
+ def friendship_confirmation
13
+ render_mail :text => "Mail content"
14
+ end
15
+ end
16
+
17
+ delivery = lambda do
18
+ TestMailer.new(TestMailer::ACTION_PARAMS).dispatch_and_deliver(:friendship_confirmation, TestMailer::MAILER_PARAMS)
19
+ end
20
+
21
+ describe TestMailer do
22
+ describe '#dispatch_and_deliver' do
23
+ before(:each) do
24
+ Resque.stub(:enqueue)
25
+ end
26
+
27
+ it 'should not deliver the email synchronously' do
28
+ lambda { delivery.call }.should_not change(Merb::Mailer.deliveries, :count)
29
+ end
30
+
31
+ it 'should place the deliver action on the Resque "mailer" queue' do
32
+ Resque.should_receive(:enqueue).with(TestMailer, TestMailer::ACTION_PARAMS, :friendship_confirmation, TestMailer::MAILER_PARAMS)
33
+ delivery.call
34
+ end
35
+
36
+ it 'should not deliver through Resque for excluded environments' do
37
+ excluded_envs = ["test", :staging]
38
+ Resque::Mailer.excluded_environments = excluded_envs
39
+
40
+ excluded_envs.each do |env|
41
+ Merb.should_receive(:env).and_return(env.to_sym)
42
+ Resque.should_not_receive(:enqueue)
43
+ delivery.call
44
+ end
45
+ end
46
+ end
47
+
48
+ describe '#dispatch_and_deliver!' do
49
+ it 'should deliver the mail' do
50
+ lambda { delivery.call }.should change(Merb::Mailer.deliveries, :count).by(1)
51
+ end
52
+ end
53
+
54
+ describe ".queue" do
55
+ it "should return default queue name" do
56
+ TestMailer.queue.should == "foobar"
57
+ end
58
+ end
59
+
60
+ describe ".perform" do
61
+ it 'should perform a queued mailer job' do
62
+ lambda do
63
+ TestMailer.perform(TestMailer::ACTION_PARAMS, :friendship_confirmation, TestMailer::MAILER_PARAMS)
64
+ end.should change(Merb::Mailer.deliveries, :count).by(1)
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,22 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'spec'
4
+ require 'spec/autorun'
5
+
6
+ require 'merb-core'
7
+ require 'merb-mailer'
8
+
9
+ Merb::Config.use do |c|
10
+ c[:session_store] = :memory
11
+ end
12
+
13
+ # Merb.start :environment => 'test'
14
+ Merb.start_environment(:testing => true, :adapter => 'runner', :environment => 'test')
15
+ Merb::Mailer.delivery_method = :test_send
16
+
17
+ require 'merb-resque-mailer'
18
+
19
+ Spec::Runner.configure do |config|
20
+ config.include Merb::Test::RequestHelper
21
+ config.include Merb::Test::ControllerHelper
22
+ end
metadata ADDED
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: merb-resque-mailer
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.4"
5
+ platform: ruby
6
+ authors:
7
+ - Marcin Kulik
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-01-22 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: resque
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description:
26
+ email: marcin.kulik@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files: []
32
+
33
+ files:
34
+ - lib/merb-resque-mailer.rb
35
+ - README.md
36
+ - spec/spec_helper.rb
37
+ - spec/merb-resque-mailer_spec.rb
38
+ has_rdoc: true
39
+ homepage: http://sickill.net
40
+ licenses: []
41
+
42
+ post_install_message:
43
+ rdoc_options: []
44
+
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: "0"
52
+ version:
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ version:
59
+ requirements: []
60
+
61
+ rubyforge_project:
62
+ rubygems_version: 1.3.5
63
+ signing_key:
64
+ specification_version: 3
65
+ summary: Merb plugin for putting mail delivery jobs onto Resque queue
66
+ test_files: []
67
+