action_mailer-enqueable 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bc1cd03c838f33278daa254d8c1f08631d7813fe
4
+ data.tar.gz: 6d91798e2ce3f7c0731fda1d11dbc1596dd1065f
5
+ SHA512:
6
+ metadata.gz: b756c8692a2c513cf857c652ca5dcc543ef40edc39a90dd784d683d603b3ef2e84be12e5f06203cc60aa2ca5eded33eca746862f3b0e7c458028c01e861cf723
7
+ data.tar.gz: ee142f0a6e318f7d38819a9750ce706bd323a59abcb1216a87e0df62700a16c4ababf2ac35c1db0bff34f6671532e7a7b830834bbbec6226ffa9f9794cb986e6
@@ -3,25 +3,38 @@ require 'action_mailer/enqueable/deferred'
3
3
  require 'active_support/core_ext/class/attribute'
4
4
 
5
5
  module ActionMailer::Enqueable
6
+ class Proxy
7
+ attr_reader :mailer_class
8
+
9
+ def initialize(mailer_class, method_id, arguments)
10
+ @mailer_class = mailer_class
11
+ @method_id = method_id
12
+ @arguments = arguments
13
+ end
14
+
15
+ def deliver
16
+ deferred = Deferred.new(:mailer_name => @mailer_class.name, :method_id => @method_id.to_s, :arguments => @arguments)
17
+ @mailer_class.queue.enqueue(deferred)
18
+ deferred
19
+ end
20
+
21
+ def create
22
+ @mailer_class.send(:method_missing_without_proxy, @method_id, *@arguments)
23
+ end
24
+ end
6
25
 
7
26
  def self.extended(base)
8
27
  base.class_attribute :queue
9
- end
28
+ class << base
29
+ alias_method :method_missing_without_proxy, :method_missing
10
30
 
11
- def method_missing(method_symbol, *parameters) #:nodoc:
12
- if match = matches_dynamic_method?(method_symbol)
13
- if queue && match[1] == 'deliver'
14
- enqueue(match[2], parameters)
15
- else
16
- super
31
+ def method_missing(name, *args, &block)
32
+ if queue
33
+ Proxy.new(self, name, args)
34
+ else
35
+ super
36
+ end
17
37
  end
18
38
  end
19
39
  end
20
-
21
- def enqueue(method_id, arguments)
22
- deferred = Deferred.new(:mailer_name => name, :method_id => method_id, :arguments => arguments)
23
- queue.enqueue(deferred)
24
- deferred
25
- end
26
-
27
40
  end
@@ -27,13 +27,8 @@ module ActionMailer::Enqueable
27
27
  @params.symbolize_keys!
28
28
  end
29
29
 
30
- # ActionMailer does some bizzare stuff with #new.
31
- def mailer
32
- @mailer ||= begin
33
- mailer = mailer_class.allocate
34
- mailer.send(:initialize, method_id, *arguments)
35
- mailer
36
- end
30
+ def mail
31
+ @mailer ||= mailer_class.send(method_id, *arguments).create
37
32
  end
38
33
 
39
34
  def mailer_class
@@ -1,5 +1,5 @@
1
1
  module ActionMailer
2
2
  module Enqueable
3
- VERSION = "1.0.0"
3
+ VERSION = "2.0.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,48 +1,113 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: action_mailer-enqueable
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
5
- prerelease:
4
+ version: 2.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Eric Chapweske
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-02-13 00:00:00.000000000 Z
11
+ date: 2014-02-03 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: activesupport
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - '='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
- version: 2.3.16
19
+ version: '0'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - '='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
- version: 2.3.16
26
+ version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: actionmailer
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - '='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
- version: 2.3.16
33
+ version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - '='
38
+ - - '>='
44
39
  - !ruby/object:Gem::Version
45
- version: 2.3.16
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: appraisal
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '0.5'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '0.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: debugger
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest-rg
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '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'
97
+ - !ruby/object:Gem::Dependency
98
+ name: bump
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
46
111
  description: Serialize and enqueue deliveries for existing mailers
47
112
  email:
48
113
  - eac@zendesk.com
@@ -50,44 +115,32 @@ executables: []
50
115
  extensions: []
51
116
  extra_rdoc_files: []
52
117
  files:
53
- - .gitignore
54
- - Gemfile
55
- - LICENSE
56
- - README.md
57
- - Rakefile
58
- - action_mailer-enqueable.gemspec
59
118
  - lib/action_mailer/enqueable.rb
60
119
  - lib/action_mailer/enqueable/deferred.rb
61
120
  - lib/action_mailer/enqueable/record_encoder.rb
62
121
  - lib/action_mailer/enqueable/version.rb
63
- - test/deferred_test.rb
64
- - test/enqueable_test.rb
65
- - test/helper.rb
66
- homepage: ''
67
- licenses: []
122
+ homepage: https://github.com/eac/action_mailer-enqueable/
123
+ licenses:
124
+ - MIT
125
+ metadata: {}
68
126
  post_install_message:
69
127
  rdoc_options: []
70
128
  require_paths:
71
129
  - lib
72
130
  required_ruby_version: !ruby/object:Gem::Requirement
73
- none: false
74
131
  requirements:
75
- - - ! '>='
132
+ - - '>='
76
133
  - !ruby/object:Gem::Version
77
134
  version: '0'
78
135
  required_rubygems_version: !ruby/object:Gem::Requirement
79
- none: false
80
136
  requirements:
81
- - - ! '>='
137
+ - - '>='
82
138
  - !ruby/object:Gem::Version
83
139
  version: '0'
84
140
  requirements: []
85
141
  rubyforge_project:
86
- rubygems_version: 1.8.21
142
+ rubygems_version: 2.0.14
87
143
  signing_key:
88
- specification_version: 3
144
+ specification_version: 4
89
145
  summary: ''
90
- test_files:
91
- - test/deferred_test.rb
92
- - test/enqueable_test.rb
93
- - test/helper.rb
146
+ test_files: []
data/.gitignore DELETED
@@ -1,17 +0,0 @@
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 DELETED
@@ -1,4 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in action_mailer-enqueable.gemspec
4
- gemspec
data/LICENSE DELETED
@@ -1,22 +0,0 @@
1
- Copyright (c) 2013 Eric Chapweske
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 DELETED
@@ -1,36 +0,0 @@
1
- # ActionMailer::Enqueable
2
-
3
- Drop in support for using queues with existing delivery methods. Works with mailers that accept ActiveRecord, and simple JSON-compatible objects as arguments.
4
-
5
- ## Installation
6
-
7
- Add this line to your application's Gemfile:
8
-
9
- gem 'action_mailer-enqueable'
10
-
11
- ## Usage
12
-
13
- ```ruby
14
- class EnqueableMailer < ActionMailer::Base
15
- extend ActionMailer::Enqueable
16
-
17
- self.delivery_method = :test
18
- self.queue = MailRenderingJob
19
-
20
- def welcome(user)
21
- recipients 'You'
22
- from 'Me'
23
-
24
- body "Email: Hello, #{user}"
25
- end
26
-
27
- end
28
-
29
- class MailRenderingJob
30
-
31
- def self.enqueue(deferred)
32
- Resque.enqueue(deferred.encoded)
33
- end
34
-
35
- end
36
- ````
data/Rakefile DELETED
@@ -1,11 +0,0 @@
1
- #!/usr/bin/env rake
2
- #require 'rake'
3
- require 'rake/testtask'
4
-
5
- Rake::TestTask.new(:test) do |test|
6
- test.libs << 'test'
7
- test.pattern = 'test/*_test.rb'
8
- test.verbose = true
9
- end
10
-
11
- task :default => :test
@@ -1,20 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/action_mailer/enqueable/version', __FILE__)
3
-
4
- Gem::Specification.new do |gem|
5
- gem.authors = ["Eric Chapweske"]
6
- gem.email = ["eac@zendesk.com"]
7
- gem.description = "Serialize and enqueue deliveries for existing mailers"
8
- gem.summary = %q{}
9
- gem.homepage = ""
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 = "action_mailer-enqueable"
15
- gem.require_paths = ["lib"]
16
- gem.version = ActionMailer::Enqueable::VERSION
17
-
18
- gem.add_development_dependency 'activesupport', '2.3.16'
19
- gem.add_development_dependency 'actionmailer', '2.3.16'
20
- end
@@ -1,130 +0,0 @@
1
- require_relative 'helper'
2
- require 'action_mailer/enqueable/deferred'
3
-
4
- module ActiveRecord
5
- class ActiveRecord::Base
6
- end
7
- end
8
-
9
- class DeferredTest < MiniTest::Unit::TestCase
10
-
11
- class User < ActiveRecord::Base
12
-
13
- def self.find(id)
14
- all.detect { |record| record.id == id }
15
- end
16
-
17
- def self.all
18
- @all ||= [ User.new(:id => 1, :name => 'Squirrel'),
19
- User.new(:id => 2, :name => 'Raccoon'),
20
- User.new(:id => 3, :name => 'Bear') ]
21
- end
22
-
23
- attr_accessor :id, :name
24
-
25
- def initialize(attributes)
26
- self.id = attributes[:id]
27
- self.name = attributes[:name]
28
- end
29
-
30
- end
31
-
32
- class DeferredMailer
33
-
34
- def delivery_welcome(message, attributes)
35
- "#{message} #{attributes['user'].join(',')}"
36
- end
37
-
38
- end
39
-
40
- describe 'Deferred' do
41
- before do
42
- @deferred = ActionMailer::Enqueable::Deferred.new(
43
- 'mailer_name' => 'DeferredMailer',
44
- 'method_id' => 'welcome',
45
- 'arguments' => [ 'Hello!', { 'users' => User.all } ])
46
- end
47
-
48
- it 'is equal to another deferred object when all params are equal' do
49
- other = ActionMailer::Enqueable::Deferred.new(
50
- 'mailer_name' => 'DeferredMailer',
51
- 'method_id' => 'welcome',
52
- 'arguments' => [ 'Hello!', { 'users' => User.all } ])
53
-
54
- assert_equal @deferred, other
55
- end
56
-
57
- describe 'valid?' do
58
-
59
- it 'is false when :mailer_name, :method_id or :arguments are missing' do
60
- @deferred.params.delete(:mailer_name)
61
- assert_equal false, @deferred.valid?
62
- end
63
-
64
- it 'is true when :mailer_name, :method_id, and :arguments are all present' do
65
- assert_equal true, @deferred.valid?
66
- end
67
-
68
- it 'populates errors' do
69
- assert_equal nil, @deferred.errors
70
- @deferred.valid?
71
- assert_equal [], @deferred.errors
72
-
73
- @deferred.params.delete(:mailer_name)
74
- @deferred.valid?
75
- assert_equal [ "mailer_name can't be nil" ], @deferred.errors
76
- end
77
-
78
- end
79
-
80
- describe 'validate!' do
81
-
82
- it 'raises an error when invalid' do
83
- @deferred.params.delete(:mailer_name)
84
- assert_equal false, @deferred.valid?
85
- assert_raises(ActionMailer::Enqueable::Deferred::Invalid) { @deferred.validate! }
86
- end
87
-
88
- it 'does not raise an error when valid' do
89
- assert_equal true, @deferred.valid?
90
- assert @deferred.validate!
91
- end
92
- end
93
-
94
- describe 'to_json' do
95
-
96
- it 'converts ActiveRecord objects into an easily deserializable form' do
97
- encoded = '{"mailer_name":"DeferredMailer","method_id":"welcome","arguments":["Hello!",{"users":[{"class":"DeferredTest::User","id":1},{"class":"DeferredTest::User","id":2},{"class":"DeferredTest::User","id":3}]}]}'
98
- assert_equal encoded, @deferred.to_json
99
- end
100
-
101
- end
102
-
103
- describe 'from_json' do
104
-
105
- it 'deserializes correctly' do
106
- decoded = ActionMailer::Enqueable::Deferred.from_json(@deferred.to_json)
107
- assert_equal 'DeferredMailer', decoded.mailer_name
108
- assert_equal 'welcome', decoded.method_id
109
- assert_equal [ 'Hello!', { 'users' => User.all } ], decoded.arguments
110
- end
111
-
112
- end
113
-
114
- describe 'RecordEncoder' do
115
-
116
- it "throws an exception when encoding records that can't be decoded" do
117
- record = User.new(:id => nil)
118
- exception = ActionMailer::Enqueable::RecordEncoder::RecordIdMissingError
119
- encoder = ActionMailer::Enqueable::RecordEncoder
120
-
121
- assert_raises(exception) { encoder.encode({ :record => record }) }
122
- end
123
-
124
- end
125
-
126
- end
127
-
128
- end
129
-
130
-
@@ -1,55 +0,0 @@
1
- require_relative 'helper'
2
- require 'action_mailer'
3
- require 'action_mailer/enqueable'
4
-
5
- class EnqueableTest < MiniTest::Unit::TestCase
6
-
7
- class EnqueableMailer < ActionMailer::Base
8
- extend ActionMailer::Enqueable
9
-
10
- self.delivery_method = :test
11
-
12
- def welcome(user)
13
- recipients 'You'
14
- from 'Me'
15
-
16
- body "Email: Hello, #{user}"
17
- end
18
-
19
- end
20
-
21
- class Queue < Array
22
- alias enqueue push
23
- end
24
-
25
- describe 'Mailer with a queue' do
26
- before do
27
- @queue = Queue.new
28
- EnqueableMailer.queue = @queue
29
- end
30
-
31
- it 'enqueues messages instead of deliverying them' do
32
- deferred = EnqueableMailer.deliver_welcome('Buddhy')
33
- assert_equal EnqueableMailer, deferred.mailer_class
34
- assert_equal 'welcome', deferred.method_id
35
- assert_equal [ 'Buddhy' ], deferred.arguments
36
-
37
- deferred = ActionMailer::Enqueable::Deferred.new(:mailer_name => 'EnqueableTest::EnqueableMailer', :method_id => 'welcome', :arguments => [ 'Buddhy' ] )
38
- assert_equal [ deferred ], @queue
39
- end
40
-
41
- end
42
-
43
- describe 'Mailer without a queue' do
44
- before do
45
- EnqueableMailer.queue = nil
46
- end
47
-
48
- it 'delivers messages without attempting to enqueue' do
49
- mail = EnqueableMailer.deliver_welcome('Buddhy')
50
- assert_equal 'Email: Hello, Buddhy', mail.body
51
- end
52
-
53
- end
54
-
55
- end
@@ -1,3 +0,0 @@
1
- require 'bundler/setup'
2
- $LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), '../lib'))) # lib
3
- require 'minitest/autorun'