action_mailer_cache_delivery 0.3.2
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/.travis.yml +4 -0
- data/Gemfile +3 -0
- data/README.md +60 -0
- data/Rakefile +6 -0
- data/action_mailer_cache_delivery.gemspec +23 -0
- data/lib/action_mailer_cache_delivery.rb +16 -0
- data/lib/action_mailer_cache_delivery/action_mailer/base.rb +31 -0
- data/lib/action_mailer_cache_delivery/mail/cache_delivery.rb +49 -0
- data/lib/action_mailer_cache_delivery/railtie.rb +16 -0
- data/lib/action_mailer_cache_delivery/version.rb +5 -0
- data/spec/action_mailer_cache_delivery_spec.rb +76 -0
- data/spec/cache_delivery_spec.rb +39 -0
- data/spec/spec_helper.rb +11 -0
- metadata +94 -0
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
## Action Mailer Cache Delivery
|
|
2
|
+
|
|
3
|
+
[](http://travis-ci.org/p0deje/action_mailer_cache_delivery)
|
|
4
|
+
|
|
5
|
+
Enhances ActionMailer to support the `:cache` delivery method, which behaves like `:test`, except that the deliveries are marshalled to a temporary cache file, thus making them available to other processes.
|
|
6
|
+
|
|
7
|
+
You'll want to use this gem if you're testing with Selenium (or any other tool which distinct processes).
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
Add to Gemfile
|
|
12
|
+
|
|
13
|
+
```ruby
|
|
14
|
+
gem 'action_mailer_cache_delivery'
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Now run `bundle install`
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
Change delivery method in your `config/environments/test.rb`
|
|
22
|
+
|
|
23
|
+
```ruby
|
|
24
|
+
config.action_mailer.delivery_method = :cache
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
You can optionally specify location for cache file.
|
|
28
|
+
|
|
29
|
+
```ruby
|
|
30
|
+
config.action_mailer.cache_settings = { :location => "#{Rails.root}/tmp/mail.cache" }
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
To access the cached deliveries in another process, just do
|
|
34
|
+
|
|
35
|
+
```ruby
|
|
36
|
+
ActionMailer::Base.cached_deliveries
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Use with parallel_tests
|
|
40
|
+
|
|
41
|
+
If you use [parallel_tests](https://github.com/grosser/parallel_tests "parallel_tests") to run your tests in parallel, you may get unexpected errors like `EOFError`. If so, make sure cache files differ for processes. Change you `config/environment/test.rb`
|
|
42
|
+
|
|
43
|
+
```ruby
|
|
44
|
+
config.action_mailer.cache_settings = { :location => "#{Rails.root}/tmp/cache/action_mailer_cache_delivery#{ENV['TEST_ENV_NUMBER']}.cache" }
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Contributors
|
|
48
|
+
|
|
49
|
+
I tried to list there everyone who forked original version on GitHub. If you're not here, just send pull request.
|
|
50
|
+
|
|
51
|
+
* ngty (Ng Tze Yang)
|
|
52
|
+
* robinsp (Robin Spainhour)
|
|
53
|
+
* thibaudgg (Thibaud Guillaume-Gentil)
|
|
54
|
+
* liangzan (Wong Liang Zan)
|
|
55
|
+
* railssignals (Kurt Kowar)
|
|
56
|
+
* esdras (Esdras Mayrink)
|
|
57
|
+
* nicolasochem (Nicolas Ochem)
|
|
58
|
+
* reactualize
|
|
59
|
+
* ragaskar (Rajan Agaskar)
|
|
60
|
+
* marhan (Markus Hanses)
|
data/Rakefile
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
$LOAD_PATH.push File.expand_path("../lib", __FILE__)
|
|
2
|
+
require 'action_mailer_cache_delivery/version'
|
|
3
|
+
|
|
4
|
+
Gem::Specification.new do |s|
|
|
5
|
+
s.name = 'action_mailer_cache_delivery'
|
|
6
|
+
s.homepage = 'https://github.com/p0deje/action_mailer_cache_delivery'
|
|
7
|
+
s.version = ActionMailerCacheDelivery::VERSION
|
|
8
|
+
|
|
9
|
+
s.authors = 'Alex Rodionov'
|
|
10
|
+
s.email = 'p0deje@gmail.com'
|
|
11
|
+
|
|
12
|
+
s.summary = 'Cache delivery method for ActionMailer'
|
|
13
|
+
s.description = 'Cache delivery method for ActionMailer for testing emails with Selenium'
|
|
14
|
+
|
|
15
|
+
s.files = `git ls-files`.split("\n")
|
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
18
|
+
|
|
19
|
+
s.add_dependency 'actionmailer', '~> 3.0'
|
|
20
|
+
|
|
21
|
+
s.add_development_dependency 'rspec' , '~> 2.8'
|
|
22
|
+
s.add_development_dependency 'rake' , '~> 0.9'
|
|
23
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require 'action_mailer_cache_delivery/version'
|
|
2
|
+
require 'action_mailer_cache_delivery/mail/cache_delivery'
|
|
3
|
+
require 'action_mailer_cache_delivery/action_mailer/base'
|
|
4
|
+
require 'action_mailer_cache_delivery/railtie' if defined?(Rails)
|
|
5
|
+
|
|
6
|
+
module ActionMailerCacheDelivery
|
|
7
|
+
class << self
|
|
8
|
+
|
|
9
|
+
def install
|
|
10
|
+
default_path = 'cache/action_mailer_cache_deliveries.cache'
|
|
11
|
+
ActionMailer::Base.add_delivery_method :cache, Mail::CacheDelivery,
|
|
12
|
+
location: defined?(Rails) ? "#{Rails.root}/tmp/#{default_path}" : "#{Dir.tmpdir}/#{default_path}"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
end # << self
|
|
16
|
+
end # ActionMailerCacheDelivery
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module ActionMailer
|
|
2
|
+
class Base
|
|
3
|
+
class << self
|
|
4
|
+
|
|
5
|
+
#
|
|
6
|
+
# Returns an array of delivered mails.
|
|
7
|
+
#
|
|
8
|
+
# @return [Array] array of mails (each mail is an instance of Mail.)
|
|
9
|
+
#
|
|
10
|
+
def cached_deliveries
|
|
11
|
+
File.open(cache_settings[:location], 'r') do |file|
|
|
12
|
+
Marshal.load(file)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
#
|
|
17
|
+
# Clears delivered mails.
|
|
18
|
+
#
|
|
19
|
+
# It also cleans ActionMailer::Base.deliveries
|
|
20
|
+
#
|
|
21
|
+
def clear_cache
|
|
22
|
+
deliveries.clear
|
|
23
|
+
|
|
24
|
+
File.open(cache_settings[:location], 'w') do |file|
|
|
25
|
+
Marshal.dump(deliveries, file)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end # << self
|
|
30
|
+
end # Base
|
|
31
|
+
end # ActionMailer
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module Mail
|
|
2
|
+
#
|
|
3
|
+
# Performs deliveries to temporary cache file, so mails can accessed from
|
|
4
|
+
# other processes.
|
|
5
|
+
#
|
|
6
|
+
# Default location of files is:
|
|
7
|
+
# - "tmp/cache/action_mailer_cache_deliveries.cache" if you use Rails
|
|
8
|
+
# - "/tmp/cache/action_mailer_cache_deliveries.cache" if you don't use Rails
|
|
9
|
+
#
|
|
10
|
+
# However, you can overwrite location in configuration:
|
|
11
|
+
#
|
|
12
|
+
# @example
|
|
13
|
+
# config.action_mailer.cache_settings = { location: "custom/path" }
|
|
14
|
+
#
|
|
15
|
+
class CacheDelivery
|
|
16
|
+
|
|
17
|
+
# @attr [Hash] settings Settings for CacheDelivery
|
|
18
|
+
attr_accessor :settings
|
|
19
|
+
|
|
20
|
+
# @api private
|
|
21
|
+
def initialize(settings)
|
|
22
|
+
@settings = settings
|
|
23
|
+
|
|
24
|
+
# create the cache directory if it doesn't exist
|
|
25
|
+
cache_dir = File.dirname(@settings[:location])
|
|
26
|
+
FileUtils.mkdir_p(cache_dir) unless File.directory?(cache_dir)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# @api private
|
|
30
|
+
def deliver!(mail)
|
|
31
|
+
# write empty array to cache file if doesn't exist
|
|
32
|
+
unless File.exists?(@settings[:location])
|
|
33
|
+
File.open(@settings[:location], 'w') do |file|
|
|
34
|
+
Marshal.dump([], file)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# get delivered mails
|
|
39
|
+
mails = ActionMailer::Base.cached_deliveries
|
|
40
|
+
# append new one
|
|
41
|
+
mails << mail
|
|
42
|
+
# write all emails to cache file
|
|
43
|
+
File.open(@settings[:location], 'w') do |file|
|
|
44
|
+
Marshal.dump(mails, file)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end # CacheDelivery
|
|
49
|
+
end # Mail
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module ActionMailerCacheDelivery
|
|
2
|
+
class Railtie < Rails::Railtie
|
|
3
|
+
|
|
4
|
+
#
|
|
5
|
+
# Make settings available before configuration:
|
|
6
|
+
#
|
|
7
|
+
# @example
|
|
8
|
+
# config.action_mailer.delivery_method = :cache
|
|
9
|
+
# config.action_mailer.cache_settings = { location: "#{Rails.root}/tmp/mail.cache" }
|
|
10
|
+
#
|
|
11
|
+
config.before_configuration do
|
|
12
|
+
ActionMailerCacheDelivery.install
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
end # Railtie
|
|
16
|
+
end # ActionMailerCacheDelivery
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require_relative 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActionMailerCacheDelivery do
|
|
4
|
+
|
|
5
|
+
context 'with Mailer' do
|
|
6
|
+
let(:mail) do
|
|
7
|
+
Mailer.test_mail
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
before(:each) do
|
|
11
|
+
ActionMailerCacheDelivery.install
|
|
12
|
+
ActionMailer::Base.delivery_method = :cache
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe 'clear_cache' do
|
|
16
|
+
it 'should clear cache file' do
|
|
17
|
+
mail.deliver
|
|
18
|
+
ActionMailer::Base.clear_cache
|
|
19
|
+
File.open(ActionMailer::Base.cache_settings[:location], 'r') do |file|
|
|
20
|
+
Marshal.load(file)
|
|
21
|
+
end.should == []
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'should clear ActionMailer::Base.deliveries' do
|
|
25
|
+
mail.deliver
|
|
26
|
+
ActionMailer::Base.clear_cache
|
|
27
|
+
ActionMailer::Base.deliveries.should == []
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe 'cached_deliveries' do
|
|
32
|
+
before(:each) do
|
|
33
|
+
ActionMailer::Base.clear_cache
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it 'should return array' do
|
|
37
|
+
mail.deliver
|
|
38
|
+
ActionMailer::Base.cached_deliveries.should be_an(Array)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it 'should return all the sent emails' do
|
|
42
|
+
5.times do
|
|
43
|
+
mail.deliver
|
|
44
|
+
end
|
|
45
|
+
ActionMailer::Base.cached_deliveries.length.should == 5
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
context 'without Mailer' do
|
|
51
|
+
describe 'extend ActionMailer' do
|
|
52
|
+
it 'should add cached_deliveries method to ActionMailer' do
|
|
53
|
+
ActionMailerCacheDelivery.install
|
|
54
|
+
ActionMailer::Base.should respond_to(:cached_deliveries)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it 'should add clear_cache method to ActionMailer' do
|
|
58
|
+
ActionMailerCacheDelivery.install
|
|
59
|
+
ActionMailer::Base.should respond_to(:clear_cache)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
describe 'install' do
|
|
64
|
+
it 'should add :cache delivery method to ActionMailer' do
|
|
65
|
+
ActionMailerCacheDelivery.install
|
|
66
|
+
ActionMailer::Base.delivery_methods.should include(:cache)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it 'should set cache path to /tmp when Rails is not defined' do
|
|
70
|
+
ActionMailerCacheDelivery.install
|
|
71
|
+
ActionMailer::Base.delivery_method = :cache
|
|
72
|
+
ActionMailer::Base.cache_settings[:location].should == '/tmp/cache/action_mailer_cache_deliveries.cache'
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end # ActionMailerCacheDelivery
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require_relative 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Mail::CacheDelivery do
|
|
4
|
+
let(:mail) do
|
|
5
|
+
Mailer.test_mail
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
before(:each) do
|
|
9
|
+
ActionMailerCacheDelivery.install
|
|
10
|
+
ActionMailer::Base.delivery_method = :cache
|
|
11
|
+
ActionMailer::Base.clear_cache
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe 'settings' do
|
|
15
|
+
it 'should allow setting custom location' do
|
|
16
|
+
ActionMailer::Base.cache_settings = { location: '/tmp/mail.cache' }
|
|
17
|
+
mail.deliver
|
|
18
|
+
File.exists?('/tmp/mail.cache').should be_true
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe 'deliver' do
|
|
23
|
+
it 'should write mail to cache file' do
|
|
24
|
+
mail.deliver
|
|
25
|
+
File.open(ActionMailer::Base.cache_settings[:location], 'r') do |file|
|
|
26
|
+
Marshal.load(file)
|
|
27
|
+
end.should == [mail]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it 'should append mail to cache file' do
|
|
31
|
+
5.times do
|
|
32
|
+
mail.deliver
|
|
33
|
+
end
|
|
34
|
+
File.open(ActionMailer::Base.cache_settings[:location], 'r') do |file|
|
|
35
|
+
Marshal.load(file)
|
|
36
|
+
end.length.should == 5
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end # Mail::CachedDelivery
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: action_mailer_cache_delivery
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.3.2
|
|
5
|
+
prerelease:
|
|
6
|
+
platform: ruby
|
|
7
|
+
authors:
|
|
8
|
+
- Alex Rodionov
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2012-02-23 00:00:00.000000000Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: actionmailer
|
|
16
|
+
requirement: &12576240 !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: *12576240
|
|
25
|
+
- !ruby/object:Gem::Dependency
|
|
26
|
+
name: rspec
|
|
27
|
+
requirement: &12575740 !ruby/object:Gem::Requirement
|
|
28
|
+
none: false
|
|
29
|
+
requirements:
|
|
30
|
+
- - ~>
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '2.8'
|
|
33
|
+
type: :development
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: *12575740
|
|
36
|
+
- !ruby/object:Gem::Dependency
|
|
37
|
+
name: rake
|
|
38
|
+
requirement: &12575280 !ruby/object:Gem::Requirement
|
|
39
|
+
none: false
|
|
40
|
+
requirements:
|
|
41
|
+
- - ~>
|
|
42
|
+
- !ruby/object:Gem::Version
|
|
43
|
+
version: '0.9'
|
|
44
|
+
type: :development
|
|
45
|
+
prerelease: false
|
|
46
|
+
version_requirements: *12575280
|
|
47
|
+
description: Cache delivery method for ActionMailer for testing emails with Selenium
|
|
48
|
+
email: p0deje@gmail.com
|
|
49
|
+
executables: []
|
|
50
|
+
extensions: []
|
|
51
|
+
extra_rdoc_files: []
|
|
52
|
+
files:
|
|
53
|
+
- .travis.yml
|
|
54
|
+
- Gemfile
|
|
55
|
+
- README.md
|
|
56
|
+
- Rakefile
|
|
57
|
+
- action_mailer_cache_delivery.gemspec
|
|
58
|
+
- lib/action_mailer_cache_delivery.rb
|
|
59
|
+
- lib/action_mailer_cache_delivery/action_mailer/base.rb
|
|
60
|
+
- lib/action_mailer_cache_delivery/mail/cache_delivery.rb
|
|
61
|
+
- lib/action_mailer_cache_delivery/railtie.rb
|
|
62
|
+
- lib/action_mailer_cache_delivery/version.rb
|
|
63
|
+
- spec/action_mailer_cache_delivery_spec.rb
|
|
64
|
+
- spec/cache_delivery_spec.rb
|
|
65
|
+
- spec/spec_helper.rb
|
|
66
|
+
homepage: https://github.com/p0deje/action_mailer_cache_delivery
|
|
67
|
+
licenses: []
|
|
68
|
+
post_install_message:
|
|
69
|
+
rdoc_options: []
|
|
70
|
+
require_paths:
|
|
71
|
+
- lib
|
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
73
|
+
none: false
|
|
74
|
+
requirements:
|
|
75
|
+
- - ! '>='
|
|
76
|
+
- !ruby/object:Gem::Version
|
|
77
|
+
version: '0'
|
|
78
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
79
|
+
none: false
|
|
80
|
+
requirements:
|
|
81
|
+
- - ! '>='
|
|
82
|
+
- !ruby/object:Gem::Version
|
|
83
|
+
version: '0'
|
|
84
|
+
requirements: []
|
|
85
|
+
rubyforge_project:
|
|
86
|
+
rubygems_version: 1.8.16
|
|
87
|
+
signing_key:
|
|
88
|
+
specification_version: 3
|
|
89
|
+
summary: Cache delivery method for ActionMailer
|
|
90
|
+
test_files:
|
|
91
|
+
- spec/action_mailer_cache_delivery_spec.rb
|
|
92
|
+
- spec/cache_delivery_spec.rb
|
|
93
|
+
- spec/spec_helper.rb
|
|
94
|
+
has_rdoc:
|