aerogel-mailer 0.0.1 → 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.
- checksums.yaml +4 -4
- data/README.md +24 -13
- data/aerogel-mailer.gemspec +1 -1
- data/app/helpers/email.rb +1 -1
- data/config/mailer.conf +1 -0
- data/lib/aerogel/mailer.rb +3 -5
- data/lib/aerogel/mailer/core.rb +25 -16
- data/lib/aerogel/mailer/definition.rb +120 -6
- data/lib/aerogel/mailer/error.rb +5 -0
- data/lib/aerogel/mailer/version.rb +1 -1
- metadata +4 -5
- data/config/README.md +0 -3
- data/views/README.md +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 338b48b0e5fe4f6a72c29fcfe8ae28cc9b5c51a5
|
4
|
+
data.tar.gz: f25e3c711d479d5cd373ebcbb5f543b2a7ec6262
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 753dcaeb9a141af26c6ac8c2b452577965bc46231decaa45a133a3ed596bbf42687c185a07613e41b4e8ee353d1f7a626f5344ca7b39a955560e6257a270b4d4
|
7
|
+
data.tar.gz: 97926b451efa64b7171325b16ed8c22761b17ac7b677abf186bcda3b49d9805c166fba10194111320c9f48f4e8358d3b51bad2ce37943d11f34574978358c46e
|
data/README.md
CHANGED
@@ -4,22 +4,33 @@ A mail delivery module for aerogel applications.
|
|
4
4
|
|
5
5
|
## Usage
|
6
6
|
|
7
|
-
|
8
|
-
In your application's config.ru:
|
9
7
|
```ruby
|
8
|
+
# config.ru
|
10
9
|
require 'aerogel/core'
|
11
|
-
require 'aerogel/mailer'
|
10
|
+
require 'aerogel/mailer'
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
from f
|
16
|
-
to t
|
17
|
-
subject 'test'
|
18
|
-
body 'hello'
|
19
|
-
end
|
12
|
+
run Aerogel::Application.load
|
13
|
+
```
|
20
14
|
|
21
|
-
|
22
|
-
|
15
|
+
```ruby
|
16
|
+
# app/mailers/my-test-mailer.rb
|
17
|
+
# define mailer:
|
18
|
+
class Aerogel::Application
|
19
|
+
mailer :test do |f, t|
|
20
|
+
from f
|
21
|
+
to t
|
22
|
+
subject 'test'
|
23
|
+
body 'hello'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
```
|
23
27
|
|
24
|
-
|
28
|
+
```ruby
|
29
|
+
# app/routes/my-test-route.rb
|
30
|
+
# send mail from route handler:
|
31
|
+
class Aerogel::Application
|
32
|
+
get "/test-mail" do
|
33
|
+
email :test, 'from@domain.org', 'to@another.org'
|
34
|
+
end
|
35
|
+
end
|
25
36
|
```
|
data/aerogel-mailer.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["alex@kukushk.in"]
|
11
11
|
spec.description = %q{Mail sending for aerogel applications}
|
12
12
|
spec.summary = %q{Mail sending for aerogel applications}
|
13
|
-
spec.homepage = ""
|
13
|
+
spec.homepage = "https://github.com/kukushkin/aerogel-mailer"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
data/app/helpers/email.rb
CHANGED
data/config/mailer.conf
CHANGED
data/lib/aerogel/mailer.rb
CHANGED
@@ -2,6 +2,8 @@ require 'aerogel/core'
|
|
2
2
|
require 'aerogel/mailer/version'
|
3
3
|
require 'aerogel/mailer/core'
|
4
4
|
require 'aerogel/mailer/definition'
|
5
|
+
require 'aerogel/mailer/error'
|
6
|
+
|
5
7
|
|
6
8
|
module Aerogel
|
7
9
|
|
@@ -10,12 +12,8 @@ module Aerogel
|
|
10
12
|
|
11
13
|
# configure module
|
12
14
|
on_load do |app|
|
13
|
-
Mailer
|
15
|
+
app.register Aerogel::Mailer
|
14
16
|
end
|
15
17
|
|
16
|
-
# Extend Aerogel
|
17
|
-
#
|
18
|
-
extend Aerogel::Mailer
|
19
|
-
|
20
18
|
end
|
21
19
|
|
data/lib/aerogel/mailer/core.rb
CHANGED
@@ -2,21 +2,17 @@ require 'mail'
|
|
2
2
|
|
3
3
|
module Aerogel::Mailer
|
4
4
|
|
5
|
-
|
5
|
+
# Configures module Aerogel::Mailer
|
6
|
+
#
|
7
|
+
def self.registered(app)
|
6
8
|
aerogel_delivery_method = Aerogel.config.mailer.delivery_method
|
7
9
|
aerogel_delivery_options = Aerogel.config.mailer.delivery_options.raw || {}
|
8
10
|
Mail.defaults do
|
9
11
|
delivery_method aerogel_delivery_method, aerogel_delivery_options
|
10
12
|
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.register_mailer( mailer )
|
14
|
-
@mailers ||= {}
|
15
|
-
@mailers[mailer.name] = mailer
|
16
|
-
end
|
17
13
|
|
18
|
-
|
19
|
-
|
14
|
+
# load mailers
|
15
|
+
Aerogel::require_resources( :app, "mailers/**/*.rb" )
|
20
16
|
end
|
21
17
|
|
22
18
|
# Registers new mailer
|
@@ -25,24 +21,37 @@ module Aerogel::Mailer
|
|
25
21
|
Definition.new name, block
|
26
22
|
end
|
27
23
|
|
24
|
+
# Deliver email using mailer specified by +name+
|
25
|
+
#
|
28
26
|
def email( name, *args )
|
29
|
-
|
27
|
+
mailer = Aerogel::Mailer::Definition.mailers[name.to_sym]
|
28
|
+
unless mailer
|
30
29
|
raise ArgumentError.new "Mailer '#{name}' is not defined"
|
31
30
|
end
|
32
|
-
params =
|
31
|
+
params = mailer.compile( *args )
|
33
32
|
puts "** sending mail: #{params}"
|
34
33
|
begin
|
35
|
-
Mail.
|
34
|
+
message = Mail.new do
|
36
35
|
from params[:from]
|
37
36
|
to params[:to]
|
38
37
|
subject params[:subject]
|
39
|
-
|
38
|
+
text_part do
|
39
|
+
content_type 'text/plain; charset=UTF-8'
|
40
|
+
body params[:body][:text]
|
41
|
+
end if params[:body][:text]
|
42
|
+
html_part do
|
43
|
+
content_type 'text/html; charset=UTF-8'
|
44
|
+
body params[:body][:html]
|
45
|
+
end if params[:body][:html]
|
40
46
|
end
|
41
|
-
|
42
|
-
|
47
|
+
message.charset = "UTF-8"
|
48
|
+
message.deliver
|
49
|
+
rescue StandardError => e
|
50
|
+
raise Aerogel::Mailer::Error.new "Mailer '#{name}' failed to deliver email: #{e}"
|
43
51
|
end
|
44
|
-
|
52
|
+
true
|
45
53
|
end
|
46
54
|
|
47
55
|
|
56
|
+
|
48
57
|
end # module Aerogel::Mailer
|
@@ -1,14 +1,18 @@
|
|
1
1
|
module Aerogel::Mailer
|
2
2
|
class Definition
|
3
3
|
|
4
|
+
include Aerogel::Render::Scope
|
5
|
+
|
4
6
|
attr_accessor :name, :blk, :params
|
5
7
|
|
8
|
+
DEFAULT_LAYOUT = "mailer"
|
9
|
+
|
6
10
|
def initialize( name, blk )
|
7
11
|
self.name = name.to_sym
|
8
12
|
self.params = {}
|
9
13
|
self.blk = blk
|
10
14
|
|
11
|
-
|
15
|
+
self.class.register_mailer( self )
|
12
16
|
end
|
13
17
|
|
14
18
|
def from( str )
|
@@ -23,18 +27,128 @@ class Definition
|
|
23
27
|
params[:subject] = str
|
24
28
|
end
|
25
29
|
|
26
|
-
|
27
|
-
|
30
|
+
# Sets layout name for text/plain and text/html layouts
|
31
|
+
# or disables layout for message body templates.
|
32
|
+
#
|
33
|
+
# Example
|
34
|
+
# layout false # disables layout for text and html message templates
|
35
|
+
# layout 'mailer-admin' # sets layouts to 'views/layouts/mailer-admin.text.erb'
|
36
|
+
# # and 'views/layouts/mailer-admin.html.erb'
|
37
|
+
#
|
38
|
+
def layout( name )
|
39
|
+
params[:layout] = name
|
40
|
+
end
|
41
|
+
|
42
|
+
# Sets message body. Multiple calls to #body are allowed,
|
43
|
+
# e.g. for setting plain text part and html part separately.
|
44
|
+
#
|
45
|
+
# If message body is set via call to #body, existing mailer templates
|
46
|
+
# and layout will be ignored.
|
47
|
+
#
|
48
|
+
# +args+ can be a String, which sets the text/plain message body
|
49
|
+
# or a Hash.
|
50
|
+
#
|
51
|
+
# Example:
|
52
|
+
# body "This is a plain text message"
|
53
|
+
# body html: "This is a HTML only message"
|
54
|
+
# body text: "This is a plain text", html: "and <b>HTML</b> message"
|
55
|
+
#
|
56
|
+
def body( args )
|
57
|
+
params[:body] ||= {}
|
58
|
+
if args.is_a? String
|
59
|
+
params[:body][:text] = args
|
60
|
+
elsif args.is_a? Hash
|
61
|
+
params[:body][:html] = args[:html] if args.include? :html
|
62
|
+
params[:body][:text] = args[:text] if args.include? :text
|
63
|
+
else
|
64
|
+
raise ArgumentError.new "Invalid argument #{args.class} to #body"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Sets local variables to be passed to template. Multiple calls to #locals
|
69
|
+
# are allowed, variables passed this way will be merged into one set before
|
70
|
+
# passing to a template.
|
71
|
+
#
|
72
|
+
# Example:
|
73
|
+
# locals user: current_user, url: url
|
74
|
+
# locals order: order
|
75
|
+
#
|
76
|
+
def locals( args )
|
77
|
+
params[:locals] ||= {}
|
78
|
+
params[:locals].merge! args
|
28
79
|
end
|
29
80
|
|
30
|
-
def
|
81
|
+
def compile( *args )
|
31
82
|
unless args.size == blk.arity
|
32
|
-
raise
|
83
|
+
raise Aerogel::Mailer::Error.new("wrong number of arguments for mailer '#{name}': #{args.size} for #{blk.arity}")
|
84
|
+
end
|
85
|
+
@self_before_instance_eval = eval "self", blk.binding
|
86
|
+
params.clear
|
87
|
+
instance_exec( *args, &blk )
|
88
|
+
params[:from] ||= config.mailer.default_from
|
89
|
+
if params[:from].nil?
|
90
|
+
raise Aerogel::Mailer::Error.new("'from' address is not set for mailer '#{name}'")
|
33
91
|
end
|
34
|
-
|
92
|
+
render_body
|
35
93
|
params
|
36
94
|
end
|
37
95
|
|
96
|
+
def method_missing( method, *args, &block )
|
97
|
+
@self_before_instance_eval.send method, *args, &block
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.register_mailer( mailer )
|
101
|
+
@mailers ||= {}
|
102
|
+
@mailers[mailer.name] = mailer
|
103
|
+
end
|
104
|
+
|
105
|
+
def self.mailers
|
106
|
+
@mailers || {}
|
107
|
+
end
|
108
|
+
|
109
|
+
private
|
110
|
+
|
111
|
+
# Returns template file name, use cached file name if possible.
|
112
|
+
#
|
113
|
+
def fetch_template_name( filename )
|
114
|
+
@template_name_cache ||= {} # reset if reload templates is used
|
115
|
+
return @template_name_cache[filename] unless @template_name_cache[filename].nil?
|
116
|
+
if Aerogel.get_resource( :views, filename+".erb" )
|
117
|
+
@template_name_cache[filename] = filename.to_sym
|
118
|
+
else
|
119
|
+
@template_name_cache[filename] = false # template not found
|
120
|
+
end
|
121
|
+
@template_name_cache[filename]
|
122
|
+
end
|
123
|
+
|
124
|
+
# Renders message body using filled params.
|
125
|
+
# Stores rendered body (text and html parts) into params[:body] hash.
|
126
|
+
#
|
127
|
+
def render_body
|
128
|
+
params[:body] ||= {}
|
129
|
+
return unless params[:body].blank? # body set in the mailer definition block
|
130
|
+
if params[:layout] == false
|
131
|
+
layout_text = false
|
132
|
+
layout_html = false
|
133
|
+
else
|
134
|
+
layout_name = params[:layout] || DEFAULT_LAYOUT
|
135
|
+
layout_text = fetch_template_name( "layouts/#{layout_name}.text" )
|
136
|
+
layout_html = fetch_template_name( "layouts/#{layout_name}.html" )
|
137
|
+
end
|
138
|
+
body_text = fetch_template_name( "mailers/#{name}.text" )
|
139
|
+
body_html = fetch_template_name( "mailers/#{name}.html" )
|
140
|
+
if !body_text && !body_html
|
141
|
+
raise Aerogel::Mailer::Error.new "No body templates found for mailer '#{name}'"
|
142
|
+
end
|
143
|
+
if body_text
|
144
|
+
params[:body][:text] = erb body_text, layout: layout_text, locals: params[:locals]
|
145
|
+
end
|
146
|
+
if body_html
|
147
|
+
params[:body][:html] = erb body_html, layout: layout_html, locals: params[:locals]
|
148
|
+
end
|
149
|
+
true
|
150
|
+
end
|
151
|
+
|
38
152
|
end # class Definition
|
39
153
|
end # module Aerogel::Mailer
|
40
154
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aerogel-mailer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Kukushkin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-02-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aerogel-core
|
@@ -80,16 +80,15 @@ files:
|
|
80
80
|
- Rakefile
|
81
81
|
- aerogel-mailer.gemspec
|
82
82
|
- app/helpers/email.rb
|
83
|
-
- config/README.md
|
84
83
|
- config/development/mailer.conf
|
85
84
|
- config/mailer.conf
|
86
85
|
- config/production/mailer.conf
|
87
86
|
- lib/aerogel/mailer.rb
|
88
87
|
- lib/aerogel/mailer/core.rb
|
89
88
|
- lib/aerogel/mailer/definition.rb
|
89
|
+
- lib/aerogel/mailer/error.rb
|
90
90
|
- lib/aerogel/mailer/version.rb
|
91
|
-
|
92
|
-
homepage: ''
|
91
|
+
homepage: https://github.com/kukushkin/aerogel-mailer
|
93
92
|
licenses:
|
94
93
|
- MIT
|
95
94
|
metadata: {}
|
data/config/README.md
DELETED
data/views/README.md
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
A place for module views.
|