actionmailer-callbacks 0.0.2 → 1.0.0
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/.rspec +2 -0
- data/Gemfile +1 -1
- data/Guardfile +17 -0
- data/LICENSE +22 -0
- data/README.md +43 -43
- data/Rakefile +5 -4
- data/actionmailer-callbacks.gemspec +20 -21
- data/features/around_create_callback.feature +84 -0
- data/features/before_create_callback.feature +76 -0
- data/features/step_definitions/before_create_callback_steps.rb +25 -0
- data/features/support/env.rb +4 -0
- data/features/support/hooks.rb +3 -0
- data/features/support/world_extensions.rb +9 -0
- data/lib/actionmailer-callbacks.rb +6 -11
- data/lib/actionmailer-callbacks/callback.rb +25 -0
- data/lib/actionmailer-callbacks/callbackable.rb +44 -0
- data/lib/actionmailer-callbacks/extensions.rb +24 -0
- data/lib/{actionmailer/callbacks → actionmailer-callbacks}/version.rb +1 -1
- data/spec/lib/actionmailer-callbacks/callback_spec.rb +49 -0
- data/spec/lib/actionmailer-callbacks/callbackable_spec.rb +103 -0
- data/spec/lib/actionmailer-callbacks/extensions_spec.rb +35 -0
- data/spec/spec_helper.rb +2 -8
- data/spec/support/custom_matchers.rb +5 -0
- metadata +95 -29
- data/lib/actionmailer/callbacks/callback.rb +0 -22
- data/lib/actionmailer/callbacks/methods.rb +0 -116
- data/spec/callback_spec.rb +0 -53
- data/spec/fixtures/mailer_with_callbacks.rb +0 -49
- data/spec/fixtures/mailer_without_callbacks.rb +0 -8
- data/spec/integration/action_mailer_integration_spec.rb +0 -135
- data/spec/methods_spec.rb +0 -82
- data/spec/support/flag.rb +0 -21
data/.rspec
ADDED
data/Gemfile
CHANGED
data/Guardfile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'rspec', :version => 2 do
|
5
|
+
watch(%r{^spec/.+_spec\.rb$})
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
7
|
+
watch('spec/spec_helper.rb') { "spec" }
|
8
|
+
|
9
|
+
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
guard 'cucumber' do
|
14
|
+
watch(%r{^features/.+\.feature$})
|
15
|
+
watch(%r{^features/support/.+$}) { 'features' }
|
16
|
+
watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' }
|
17
|
+
end
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Andrea Longhi
|
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
CHANGED
@@ -2,46 +2,53 @@
|
|
2
2
|
|
3
3
|
[](http://travis-ci.org/spaghetticode/actionmailer-callbacks)
|
4
4
|
|
5
|
-
This gem adds
|
6
|
-
before/
|
5
|
+
This gem adds before_create and around_create to ActionMailer::Base to make it
|
6
|
+
work similarly to ActionController before/around filters and ActiveRecord::Base
|
7
|
+
callbacks:
|
7
8
|
|
8
9
|
```ruby
|
9
|
-
before_create :log_params,
|
10
|
-
|
11
|
-
before_deliver :apply_stamp, :except => [:postage_prepaid, :test_email]
|
12
|
-
after_deliver :log_success
|
13
|
-
around_create :benchmark
|
14
|
-
around_deliver :benckmark
|
10
|
+
before_create :log_params, except: :test_email
|
11
|
+
around_create :benchmark, only: :test_email
|
15
12
|
```
|
16
13
|
|
14
|
+
*except* and *only* options are optional and has same functionality as in
|
15
|
+
ActionController.
|
16
|
+
|
17
|
+
|
17
18
|
## Requirements
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
The master branch now works only with Actionmailer 3.x, if you need to add
|
21
|
+
callbacks to older versions please refer to the 0.x release.
|
22
|
+
|
23
|
+
|
24
|
+
## Installation
|
25
|
+
|
26
|
+
Add the gem to the Gemfile:
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
gem 'actionmailer-callbacks'
|
30
|
+
```
|
31
|
+
|
32
|
+
And then run ```bundle```
|
33
|
+
|
34
|
+
>>>>>>> actionmailer3
|
24
35
|
|
25
36
|
## Notes
|
26
37
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
38
|
+
If you need something like before/after deliver callbacks ActionMailer 3.x comes
|
39
|
+
ready for that: you can use an *observer* or an *instrumentation* for that.
|
40
|
+
|
41
|
+
*around_create* wrap the mail method execution (and all before_create callbacks).
|
42
|
+
You can use them for rescuing from errors or for benchmarking, for example.
|
43
|
+
There can be only one *around_create* method for each email method, if you
|
44
|
+
register more than one only the first will be executed.
|
32
45
|
|
33
|
-
*around_create* and *around_deliver* wrap the mail method execution (and all
|
34
|
-
callbacks). You can use them for rescuing from errors or for benchmarking, for
|
35
|
-
example.
|
36
|
-
There can be only 1 around_create or around_deliver method for each email method,
|
37
|
-
if there are more than 1 only the first will be executed.
|
38
46
|
|
39
47
|
## Example
|
40
48
|
|
41
49
|
```ruby
|
42
50
|
class UserMailer < ActionMailer::Base
|
43
51
|
before_create :log_params
|
44
|
-
after_deliver :log_success
|
45
52
|
around_create :rescue_from_errors
|
46
53
|
|
47
54
|
def user_registration(user)
|
@@ -50,12 +57,8 @@ if there are more than 1 only the first will be executed.
|
|
50
57
|
|
51
58
|
private
|
52
59
|
|
53
|
-
def log_params
|
54
|
-
MailerLogger.info "[CREATE] #{
|
55
|
-
end
|
56
|
-
|
57
|
-
def log_success
|
58
|
-
MailerLogger.info "[DELIVERED] #{params_inspector}"
|
60
|
+
def log_params(args)
|
61
|
+
MailerLogger.info "[CREATE] #{args.inspect}"
|
59
62
|
end
|
60
63
|
|
61
64
|
def rescue_from_errors
|
@@ -65,18 +68,15 @@ if there are more than 1 only the first will be executed.
|
|
65
68
|
puts 'An error occured!'
|
66
69
|
end
|
67
70
|
end
|
68
|
-
|
69
|
-
def params_inspector
|
70
|
-
@params.present? && @params.inject([]) do |lines, param|
|
71
|
-
message = begin
|
72
|
-
if param.is_a?(ActiveRecord::Base)
|
73
|
-
"#{param.class.name.downcase}.id = #{param.id}"
|
74
|
-
else
|
75
|
-
param
|
76
|
-
end
|
77
|
-
end
|
78
|
-
lines << message
|
79
|
-
end.join(', ')
|
80
|
-
end
|
81
71
|
end
|
82
72
|
```
|
73
|
+
|
74
|
+
|
75
|
+
## Contributing
|
76
|
+
|
77
|
+
1. Fork it
|
78
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
79
|
+
3. Add your feature tests to the rspec/cucumber test suite
|
80
|
+
4. Commit your changes (`git commit -am 'Added some feature'`)
|
81
|
+
5. Push to the branch (`git push origin my-new-feature`)
|
82
|
+
6. Create new Pull Request
|
data/Rakefile
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
-
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
|
3
|
+
require 'bundler/gem_tasks'
|
2
4
|
require 'rspec/core/rake_task'
|
3
5
|
|
4
|
-
desc
|
6
|
+
desc 'Run those specs'
|
5
7
|
task :spec do
|
6
8
|
RSpec::Core::RakeTask.new(:spec) do |t|
|
7
|
-
t.
|
8
|
-
t.pattern = 'spec/**/*_spec.rb'
|
9
|
+
t.pattern = 'spec/**/*_spec.rb'
|
9
10
|
t.rspec_path = 'bundle exec rspec'
|
10
11
|
end
|
11
12
|
end
|
@@ -1,26 +1,25 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
|
3
|
-
require 'actionmailer/callbacks/version'
|
2
|
+
require File.expand_path('../lib/actionmailer-callbacks/version', __FILE__)
|
4
3
|
|
5
|
-
Gem::Specification.new do |
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
s.summary = %q{add callbacks to actionmailer 2.3.11}
|
12
|
-
s.description = %q{add callbacks to actionmailer 2.3.11}
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ['andrea longhi']
|
6
|
+
gem.email = ['andrea@spaghetticode.it']
|
7
|
+
gem.description = %q{adds before_create, around_create callbacks to action mailer 3}
|
8
|
+
gem.summary = %q{adds before_create, around_create callbacks to action mailer 3}
|
9
|
+
gem.homepage = 'http://github.com/spaghetticode/actionmailer-callbacks'
|
13
10
|
|
14
|
-
|
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 = 'actionmailer-callbacks'
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Actionmailer::Callbacks::VERSION
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
s.add_development_dependency 'rake'
|
24
|
-
s.add_runtime_dependency 'activesupport', '~> 2.3.11'
|
25
|
-
s.add_runtime_dependency 'actionmailer', '~> 2.3.11'
|
18
|
+
gem.add_dependency 'actionmailer', '~> 3.0'
|
19
|
+
gem.add_dependency 'activesupport'
|
20
|
+
gem.add_development_dependency 'rake'
|
21
|
+
gem.add_development_dependency 'rspec', '~> 2.0'
|
22
|
+
gem.add_development_dependency 'cucumber', '~> 1.0'
|
23
|
+
gem.add_development_dependency 'guard-rspec'
|
24
|
+
gem.add_development_dependency 'guard-cucumber'
|
26
25
|
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
Feature: around_create callback
|
2
|
+
As an actionmailer gem user
|
3
|
+
I want to be able to use the around_create callback
|
4
|
+
So that I can wrap the email creation process with my callback
|
5
|
+
|
6
|
+
The "around_create" callback allows to wrap the email creation
|
7
|
+
process around another method definition.
|
8
|
+
The macro accepts the callback name as first arguments and an
|
9
|
+
optional hash with "only" and/or "except" keys that are
|
10
|
+
functionally equivalent to the ones of ActionController
|
11
|
+
before/after/around create filters: for example in order
|
12
|
+
to run a callback only for the "test" action you should
|
13
|
+
specify one of the following:
|
14
|
+
around_create :test_callback, only: :test
|
15
|
+
around_create :test_callback, only: [:test]
|
16
|
+
@focus
|
17
|
+
Scenario: successful around_create calling
|
18
|
+
Given the following mailer class with an around_create callback:
|
19
|
+
"""
|
20
|
+
class TestMailer < ::ActionMailer::Base
|
21
|
+
around_create :log_args
|
22
|
+
|
23
|
+
def self.logger
|
24
|
+
@logger ||= Array.new
|
25
|
+
end
|
26
|
+
|
27
|
+
def test(recipient)
|
28
|
+
mail(
|
29
|
+
to: recipient,
|
30
|
+
from: 'sender@test.com',
|
31
|
+
subject: 'Test Email'
|
32
|
+
)
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def log_args(*args)
|
38
|
+
self.class.logger << "Test email now being called with #{args.flatten.inspect}"
|
39
|
+
yield
|
40
|
+
self.class.logger << "Test email was successfully created"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
"""
|
44
|
+
When I run the code "TestMailer.test('recipient@test.com')"
|
45
|
+
Then an email should have been created
|
46
|
+
And the logger for the class "TestMailer" should contain:
|
47
|
+
"""
|
48
|
+
Test email now being called with ["recipient@test.com"]
|
49
|
+
"""
|
50
|
+
And the logger for the class "TestMailer" should contain:
|
51
|
+
"""
|
52
|
+
Test email was successfully created
|
53
|
+
"""
|
54
|
+
|
55
|
+
Scenario: around_create callback skipped because not included in "only" directive
|
56
|
+
Given the following mailer class with an around_create callback:
|
57
|
+
"""
|
58
|
+
class TestMailer < ::ActionMailer::Base
|
59
|
+
around_create :log_args, only: :only_method
|
60
|
+
|
61
|
+
def self.logger
|
62
|
+
@logger ||= Array.new
|
63
|
+
end
|
64
|
+
|
65
|
+
def test(recipient)
|
66
|
+
mail(
|
67
|
+
to: recipient,
|
68
|
+
from: 'sender@test.com',
|
69
|
+
subject: 'Test Email'
|
70
|
+
)
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def log_args(*args)
|
76
|
+
self.class.logger << "Test email now being called"
|
77
|
+
yield
|
78
|
+
self.class.logger << "Test email was successfully created"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
"""
|
82
|
+
When I run the code "TestMailer.test('recipient@test.com')"
|
83
|
+
Then an email should have been created
|
84
|
+
And the logger for the class "TestMailer" should be empty
|
@@ -0,0 +1,76 @@
|
|
1
|
+
Feature: before_create callback
|
2
|
+
As an actionmailer gem user
|
3
|
+
I want to be able to use the before_create callback
|
4
|
+
So that I can to execute code before creating an email
|
5
|
+
|
6
|
+
The "before_create" callback allows to execute a callback
|
7
|
+
before the email creation process. The macro accepts
|
8
|
+
the callback name as first arguments and an
|
9
|
+
optional hash with "only" and/or "except" keys that are
|
10
|
+
functionally equivalent to the ones of ActionController
|
11
|
+
before/after/around create filters: for example in order
|
12
|
+
to run a callback only for the "test" action you should
|
13
|
+
specify one of the following:
|
14
|
+
before_create :test_callback, only: :test
|
15
|
+
before_create :test_callback, only: [:test]
|
16
|
+
|
17
|
+
Scenario: successful before_create callback calling
|
18
|
+
Given the following mailer class with a before_create callback:
|
19
|
+
"""
|
20
|
+
class TestMailer < ::ActionMailer::Base
|
21
|
+
before_create :log_args
|
22
|
+
|
23
|
+
def self.logger
|
24
|
+
@logger ||= Array.new
|
25
|
+
end
|
26
|
+
|
27
|
+
def test(recipient)
|
28
|
+
mail(
|
29
|
+
to: recipient,
|
30
|
+
from: 'sender@test.com',
|
31
|
+
subject: 'Test Email'
|
32
|
+
)
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def log_args(args)
|
38
|
+
self.class.logger << "Test was called with #{args.inspect}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
"""
|
42
|
+
When I run the code "TestMailer.test('recipient@test.com').deliver"
|
43
|
+
Then an email should have been sent
|
44
|
+
And the logger for the class "TestMailer" should contain:
|
45
|
+
"""
|
46
|
+
Test was called with "recipient@test.com"
|
47
|
+
"""
|
48
|
+
|
49
|
+
Scenario: before_create callback skipped because not included in "only" directive
|
50
|
+
Given the following mailer class with a before_create callback:
|
51
|
+
"""
|
52
|
+
class TestMailer < ::ActionMailer::Base
|
53
|
+
before_create :log_args, only: :only_method
|
54
|
+
|
55
|
+
def self.logger
|
56
|
+
@logger ||= Array.new
|
57
|
+
end
|
58
|
+
|
59
|
+
def test(recipient)
|
60
|
+
mail(
|
61
|
+
to: recipient,
|
62
|
+
from: 'sender@test.com',
|
63
|
+
subject: 'Test Email'
|
64
|
+
)
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def log_args(*args)
|
70
|
+
self.class.logger << "Test was called with #{args.inspect}"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
"""
|
74
|
+
When I run the code "TestMailer.test('recipient@test.com').deliver"
|
75
|
+
Then an email should have been sent
|
76
|
+
And the logger for the class "TestMailer" should be empty
|
@@ -0,0 +1,25 @@
|
|
1
|
+
Given /^the following mailer class with an? (around_create callback|before_create callback):$/ do |_, class_definition|
|
2
|
+
context_module.class_eval class_definition
|
3
|
+
end
|
4
|
+
|
5
|
+
When /^I run the code "(.*?)"$/ do |code|
|
6
|
+
self.code_result = context_module.class_eval code
|
7
|
+
end
|
8
|
+
|
9
|
+
Then /^the logger for the class "(.*?)" should contain:$/ do |class_name, log|
|
10
|
+
klass = context_module.const_get(class_name)
|
11
|
+
klass.logger.should include(log)
|
12
|
+
end
|
13
|
+
|
14
|
+
Then /^an email should have been sent$/ do
|
15
|
+
ActionMailer::Base.deliveries.size.should == 1
|
16
|
+
end
|
17
|
+
|
18
|
+
Then /^the logger for the class "(.*?)" should be empty$/ do |class_name|
|
19
|
+
klass = context_module.const_get(class_name)
|
20
|
+
klass.logger.should == []
|
21
|
+
end
|
22
|
+
|
23
|
+
Then /^an email should have been created$/ do
|
24
|
+
code_result.should be_a(Mail::Message)
|
25
|
+
end
|