padrino-mailer 0.1.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/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Padrino
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,7 @@
1
+ = padrino-mailer
2
+
3
+ Description goes here.
4
+
5
+ == Copyright
6
+
7
+ Copyright (c) 2009 Padrino. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,59 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "padrino-mailer"
8
+ gem.summary = "Mailer system for padrino"
9
+ gem.description = "Mailer system for padrino allowing easy delivery of application emails"
10
+ gem.email = "nesquena@gmail.com"
11
+ gem.homepage = "http://github.com/padrino/padrino-mailer"
12
+ gem.authors = ["Padrino Team", "Nathan Esquenazi", "Davide D'Agostino", "Arthur Chiu"]
13
+ gem.add_runtime_dependency "sinatra", ">= 0.9.2"
14
+ gem.add_runtime_dependency "tilt", ">= 0.2"
15
+ gem.add_development_dependency "shoulda", ">= 0"
16
+ gem.add_development_dependency "haml", ">= 2.2.1"
17
+ gem.add_development_dependency "mocha", ">= 0.9.7"
18
+ gem.add_development_dependency "rack-test", ">= 0.5.0"
19
+ gem.add_development_dependency "webrat", ">= 0.5.1"
20
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
21
+ end
22
+ Jeweler::GemcutterTasks.new
23
+ rescue LoadError
24
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
25
+ end
26
+
27
+ require 'rake/testtask'
28
+ Rake::TestTask.new(:test) do |test|
29
+ test.libs << 'lib' << 'test'
30
+ test.pattern = 'test/**/test_*.rb'
31
+ test.verbose = true
32
+ end
33
+
34
+ begin
35
+ require 'rcov/rcovtask'
36
+ Rcov::RcovTask.new do |test|
37
+ test.libs << 'test'
38
+ test.pattern = 'test/**/test_*.rb'
39
+ test.verbose = true
40
+ end
41
+ rescue LoadError
42
+ task :rcov do
43
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
44
+ end
45
+ end
46
+
47
+ task :test => :check_dependencies
48
+
49
+ task :default => :test
50
+
51
+ require 'rake/rdoctask'
52
+ Rake::RDocTask.new do |rdoc|
53
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
54
+
55
+ rdoc.rdoc_dir = 'rdoc'
56
+ rdoc.title = "padrino-mailer #{version}"
57
+ rdoc.rdoc_files.include('README*')
58
+ rdoc.rdoc_files.include('lib/**/*.rb')
59
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,75 @@
1
+ =begin
2
+
3
+ This is the abstract class that other mailers will inherit from in order to send mail
4
+
5
+ You can set the default delivery settings through:
6
+
7
+ Padrino::Mailer::Base.smtp_settings = {
8
+ :host => 'smtp.yourserver.com',
9
+ :port => '25',
10
+ :user => 'user',
11
+ :pass => 'pass',
12
+ :auth => :plain # :plain, :login, :cram_md5, no auth by default
13
+ :domain => "localhost.localdomain" # the HELO domain provided by the client to the server
14
+ }
15
+
16
+ and then all delivered mail will use these settings unless otherwise specified.
17
+
18
+ =end
19
+
20
+ module Padrino
21
+ module Mailer
22
+ class Base
23
+ # Returns the available mail fields when composing a message
24
+ def self.mail_fields
25
+ [:to, :from, :subject, :type, :charset, :via, :attachments]
26
+ end
27
+
28
+ attr_accessor :mail_attributes
29
+
30
+ def initialize(mail_name=nil)
31
+ @mail_name = mail_name
32
+ @mail_attributes = {}
33
+ end
34
+
35
+ # Defines a method allowing mail attributes to be set into a hash for use when delivering
36
+ self.mail_fields.each do |field|
37
+ define_method(field) { |value| @mail_attributes[field] = value }
38
+ end
39
+
40
+ # Assigns the body key to the mail attributes either with the rendered body from a template or the given string value
41
+ def body(body_value)
42
+ @mail_attributes[:body] = Tilt.new(template_path).render(self, body_value.symbolize_keys) if body_value.is_a?(Hash)
43
+ @mail_attributes[:body] = body_value if body_value.is_a?(String)
44
+ end
45
+
46
+ # Returns the path to the email template searched for using glob pattern
47
+ def template_path
48
+ Dir[File.join(self.views_path, self.class.name.underscore.split("/").last, "#{@mail_name}.*")].first
49
+ end
50
+
51
+ cattr_accessor :smtp_settings
52
+ cattr_accessor :views_path
53
+
54
+ # Delivers the specified message for mail_name to the intended recipients
55
+ # mail_name corresponds to the name of a defined method within the mailer class
56
+ # SampleMailer.deliver(:birthday_message)
57
+ def self.deliver(mail_name, *args)
58
+ mail_object = self.new(mail_name)
59
+ mail_object.method(mail_name).call(*args)
60
+ MailObject.new(mail_object.mail_attributes, self.smtp_settings).deliver
61
+ end
62
+
63
+ # Returns true if a mail exists with the name being delivered
64
+ def self.respond_to?(method_sym, include_private = false)
65
+ method_sym.to_s =~ /deliver_(.*)/ ? self.method_defined?($1) : super
66
+ end
67
+
68
+ # Handles method missing for a mailer class. Delivers a message based on the method
69
+ # being called i.e #deliver_birthday_message(22) invokes #birthday_message(22) to setup mail object
70
+ def self.method_missing(method_sym, *arguments, &block)
71
+ method_sym.to_s =~ /deliver_(.*)/ ? self.deliver($1, *arguments) : super
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,94 @@
1
+ require 'rubygems'
2
+ require 'net/smtp'
3
+ begin
4
+ require 'smtp_tls'
5
+ rescue LoadError
6
+ end
7
+ require 'base64'
8
+ require 'tmail'
9
+
10
+ module Padrino
11
+ module Mailer
12
+ module Delivery
13
+
14
+ class << self
15
+
16
+ def mail(options)
17
+ raise(ArgumentError, ":to is required") unless options[:to]
18
+
19
+ via = options.delete(:via)
20
+ if via.nil?
21
+ transport build_tmail(options)
22
+ else
23
+ if via_options.include?(via.to_s)
24
+ send("transport_via_#{via}", build_tmail(options), options)
25
+ else
26
+ raise(ArgumentError, ":via must be either smtp or sendmail")
27
+ end
28
+ end
29
+ end
30
+
31
+ def build_tmail(options)
32
+ mail = TMail::Mail.new
33
+ mail.to = options[:to]
34
+ mail.from = options[:from] || 'pony@unknown'
35
+ mail.subject = options[:subject]
36
+ mail.body = options[:body] || ""
37
+ mail.set_content_type 'text', options[:type] || 'plain', {'charset'=> options[:charset] || 'utf-8'}
38
+ (options[:attachments] || []).each do |name, body|
39
+ attachment = TMail::Mail.new
40
+ attachment.transfer_encoding = "base64"
41
+ attachment.body = Base64.encode64(body)
42
+ # attachment.set_content_type # TODO: if necessary
43
+ attachment.set_content_disposition "attachment", "filename" => name
44
+ mail.parts.push attachment
45
+ end
46
+ mail
47
+ end
48
+
49
+ def sendmail_binary
50
+ @sendmail_binary ||= `which sendmail`.chomp
51
+ end
52
+
53
+ def transport(tmail)
54
+ if File.executable? sendmail_binary
55
+ transport_via_sendmail(tmail)
56
+ else
57
+ transport_via_smtp(tmail)
58
+ end
59
+ end
60
+
61
+ def via_options
62
+ %w(sendmail smtp)
63
+ end
64
+
65
+ def transport_via_sendmail(tmail, options={})
66
+ IO.popen('-', 'w+') do |pipe|
67
+ if pipe
68
+ pipe.write(tmail.to_s)
69
+ else
70
+ exec(sendmail_binary, *tmail.to)
71
+ end
72
+ end
73
+ end
74
+
75
+ def transport_via_smtp(tmail, options={:smtp => {}})
76
+ default_options = {:smtp => { :host => 'localhost', :port => '25', :domain => 'localhost.localdomain' }}
77
+ o = default_options[:smtp].merge(options[:smtp])
78
+ smtp = Net::SMTP.new(o[:host], o[:port])
79
+ if o[:tls]
80
+ raise "You may need: gem install smtp_tls" unless smtp.respond_to?(:enable_starttls)
81
+ smtp.enable_starttls
82
+ end
83
+ if o.include?(:auth)
84
+ smtp.start(o[:domain], o[:user], o[:password], o[:auth])
85
+ else
86
+ smtp.start(o[:domain])
87
+ end
88
+ smtp.send_message tmail.to_s, tmail.from, tmail.to
89
+ smtp.finish
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,39 @@
1
+ # This represents a particular mail object which will need to be sent
2
+ # A mail_object requires the mail attributes and the delivery_settings
3
+
4
+ module Padrino
5
+ module Mailer
6
+ class MailObject
7
+ def initialize(mail_attributes={}, smtp_settings={})
8
+ @mail_attributes = mail_attributes.dup
9
+ @smtp_settings = smtp_settings.dup if smtp_settings.present?
10
+ end
11
+
12
+ # Constructs the delivery attributes for the message and then sends the mail
13
+ # @mail_object.deliver
14
+ def deliver
15
+ @mail_attributes.reverse_merge!(:via => self.delivery_method.to_sym)
16
+ @mail_attributes.reverse_merge!(:smtp => @smtp_settings) if using_smtp?
17
+ self.send_mail(@mail_attributes)
18
+ end
19
+
20
+ protected
21
+
22
+ # Returns the delivery method to use for this mail object
23
+ # @mo.delivery_method => :smtp || :sendmail
24
+ def delivery_method
25
+ @mail_attributes[:via] || (@smtp_settings.present? ? :smtp : :sendmail)
26
+ end
27
+
28
+ # Returns true if the mail object is going to be delivered using smtp
29
+ def using_smtp?
30
+ delivery_method.to_s =~ /smtp/
31
+ end
32
+
33
+ # Performs the actual email sending
34
+ def send_mail(delivery_attributes)
35
+ Delivery.mail(delivery_attributes) && true
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,11 @@
1
+ require 'tilt'
2
+ # require 'padrino-core/support_lite'
3
+ Dir[File.dirname(__FILE__) + '/padrino-mailer/**/*.rb'].each { |file| require file }
4
+
5
+ module Padrino
6
+ module Mailer
7
+ def self.registered(app)
8
+ Padrino::Mailer::Base::views_path = app.views
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,86 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{padrino-mailer}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Padrino Team", "Nathan Esquenazi", "Davide D'Agostino", "Arthur Chiu"]
12
+ s.date = %q{2009-11-16}
13
+ s.description = %q{Mailer system for padrino allowing easy delivery of application emails}
14
+ s.email = %q{nesquena@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "lib/padrino-mailer.rb",
27
+ "lib/padrino-mailer/base.rb",
28
+ "lib/padrino-mailer/delivery.rb",
29
+ "lib/padrino-mailer/mail_object.rb",
30
+ "padrino-mailer.gemspec",
31
+ "test/active_support_helpers.rb",
32
+ "test/fixtures/mailer_app/app.rb",
33
+ "test/fixtures/mailer_app/views/demo_mailer/sample_mail.erb",
34
+ "test/fixtures/mailer_app/views/sample_mailer/anniversary_message.erb",
35
+ "test/fixtures/mailer_app/views/sample_mailer/birthday_message.erb",
36
+ "test/helper.rb",
37
+ "test/test_mail_object.rb",
38
+ "test/test_mailer_base.rb",
39
+ "test/test_padrino_mailer.rb"
40
+ ]
41
+ s.homepage = %q{http://github.com/padrino/padrino-mailer}
42
+ s.rdoc_options = ["--charset=UTF-8"]
43
+ s.require_paths = ["lib"]
44
+ s.rubygems_version = %q{1.3.5}
45
+ s.summary = %q{Mailer system for padrino}
46
+ s.test_files = [
47
+ "test/active_support_helpers.rb",
48
+ "test/fixtures/mailer_app/app.rb",
49
+ "test/helper.rb",
50
+ "test/test_mail_object.rb",
51
+ "test/test_mailer_base.rb",
52
+ "test/test_padrino_mailer.rb"
53
+ ]
54
+
55
+ if s.respond_to? :specification_version then
56
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
57
+ s.specification_version = 3
58
+
59
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
60
+ s.add_runtime_dependency(%q<sinatra>, [">= 0.9.2"])
61
+ s.add_runtime_dependency(%q<tilt>, [">= 0.2"])
62
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
63
+ s.add_development_dependency(%q<haml>, [">= 2.2.1"])
64
+ s.add_development_dependency(%q<mocha>, [">= 0.9.7"])
65
+ s.add_development_dependency(%q<rack-test>, [">= 0.5.0"])
66
+ s.add_development_dependency(%q<webrat>, [">= 0.5.1"])
67
+ else
68
+ s.add_dependency(%q<sinatra>, [">= 0.9.2"])
69
+ s.add_dependency(%q<tilt>, [">= 0.2"])
70
+ s.add_dependency(%q<shoulda>, [">= 0"])
71
+ s.add_dependency(%q<haml>, [">= 2.2.1"])
72
+ s.add_dependency(%q<mocha>, [">= 0.9.7"])
73
+ s.add_dependency(%q<rack-test>, [">= 0.5.0"])
74
+ s.add_dependency(%q<webrat>, [">= 0.5.1"])
75
+ end
76
+ else
77
+ s.add_dependency(%q<sinatra>, [">= 0.9.2"])
78
+ s.add_dependency(%q<tilt>, [">= 0.2"])
79
+ s.add_dependency(%q<shoulda>, [">= 0"])
80
+ s.add_dependency(%q<haml>, [">= 2.2.1"])
81
+ s.add_dependency(%q<mocha>, [">= 0.9.7"])
82
+ s.add_dependency(%q<rack-test>, [">= 0.5.0"])
83
+ s.add_dependency(%q<webrat>, [">= 0.5.1"])
84
+ end
85
+ end
86
+
@@ -0,0 +1,7 @@
1
+ unless Fixnum.method_defined?(:days)
2
+ require 'active_support/core_ext/object/misc'
3
+ require 'active_support/core_ext/date'
4
+ require 'active_support/core_ext/time'
5
+ require 'active_support/core_ext/numeric'
6
+ require 'active_support/duration'
7
+ end
@@ -0,0 +1,50 @@
1
+ require 'sinatra/base'
2
+ require 'haml'
3
+
4
+ class MailerDemo < Sinatra::Base
5
+ configure do
6
+ set :root, File.dirname(__FILE__)
7
+ set :smtp_settings, {
8
+ :host => 'smtp.gmail.com',
9
+ :port => '587',
10
+ :tls => true,
11
+ :user => 'user',
12
+ :pass => 'pass',
13
+ :auth => :plain
14
+ }
15
+ end
16
+
17
+ register Padrino::Mailer
18
+
19
+ class SampleMailer < Padrino::Mailer::Base
20
+ def birthday_message(name, age)
21
+ subject "Happy Birthday!"
22
+ to 'john@fake.com'
23
+ from 'noreply@birthday.com'
24
+ body 'name' => name, 'age' => age
25
+ via :smtp
26
+ end
27
+
28
+ def anniversary_message(names, years_married)
29
+ subject "Happy anniversary!"
30
+ to 'julie@fake.com'
31
+ from 'noreply@anniversary.com'
32
+ body 'names' => names, 'years_married' => years_married
33
+ type 'html'
34
+ end
35
+ end
36
+
37
+ post "/deliver/plain" do
38
+ result = SampleMailer.deliver_birthday_message("Joey", 21)
39
+ result ? "mail delivered" : 'mail not delivered'
40
+ end
41
+
42
+ post "/deliver/html" do
43
+ result = SampleMailer.deliver_anniversary_message("Joey & Charlotte", 16)
44
+ result ? "mail delivered" : 'mail not delivered'
45
+ end
46
+ end
47
+
48
+ class MailerUser
49
+
50
+ end
@@ -0,0 +1 @@
1
+ This is a sample message
@@ -0,0 +1,2 @@
1
+ <p>Yay <%= names %>!</p>
2
+ <p>You have been married <%= years_married %> years</p>
@@ -0,0 +1,2 @@
1
+ Happy Birthday <%= name %>!
2
+ You are turning <%= age %>
data/test/helper.rb ADDED
@@ -0,0 +1,74 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+ require 'mocha'
5
+ require 'rack/test'
6
+ require 'webrat'
7
+
8
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
9
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
10
+ require 'active_support_helpers'
11
+ require File.dirname(__FILE__) + '/../../padrino-helpers/lib/padrino-helpers.rb'
12
+ require File.dirname(__FILE__) + '/../lib/padrino-mailer.rb'
13
+
14
+ class Test::Unit::TestCase
15
+ include Padrino::Helpers::OutputHelpers
16
+ include Padrino::Helpers::TagHelpers
17
+ include Padrino::Helpers::AssetTagHelpers
18
+ include Rack::Test::Methods
19
+ include Webrat::Methods
20
+ include Webrat::Matchers
21
+
22
+ Webrat.configure do |config|
23
+ config.mode = :rack
24
+ end
25
+
26
+ def stop_time_for_test
27
+ time = Time.now
28
+ Time.stubs(:now).returns(time)
29
+ return time
30
+ end
31
+
32
+ # assert_has_tag(:h1, :content => "yellow") { "<h1>yellow</h1>" }
33
+ # In this case, block is the html to evaluate
34
+ def assert_has_tag(name, attributes = {}, &block)
35
+ html = block && block.call
36
+ matcher = HaveSelector.new(name, attributes)
37
+ raise "Please specify a block!" if html.blank?
38
+ assert matcher.matches?(html), matcher.failure_message
39
+ end
40
+
41
+ # assert_has_no_tag, tag(:h1, :content => "yellow") { "<h1>green</h1>" }
42
+ # In this case, block is the html to evaluate
43
+ def assert_has_no_tag(name, attributes = {}, &block)
44
+ html = block && block.call
45
+ attributes.merge!(:count => 0)
46
+ matcher = HaveSelector.new(name, attributes)
47
+ raise "Please specify a block!" if html.blank?
48
+ assert matcher.matches?(html), matcher.failure_message
49
+ end
50
+
51
+ # Silences the output by redirecting to stringIO
52
+ # silence_logger { ...commands... } => "...output..."
53
+ def silence_logger(&block)
54
+ orig_stdout = $stdout
55
+ $stdout = log_buffer = StringIO.new
56
+ block.call
57
+ $stdout = orig_stdout
58
+ log_buffer.rewind && log_buffer.read
59
+ end
60
+
61
+ # Asserts that a file matches the pattern
62
+ def assert_match_in_file(pattern, file)
63
+ assert File.exist?(file), "File '#{file}' does not exist!"
64
+ assert_match pattern, File.read(file)
65
+ end
66
+ end
67
+
68
+ module Webrat
69
+ module Logging
70
+ def logger # :nodoc:
71
+ @logger = nil
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,25 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class TestMailObject < Test::Unit::TestCase
4
+ include Padrino::Mailer
5
+
6
+ context 'for #deliver method' do
7
+ should "send mail with attributes default to sendmail no smtp" do
8
+ mail_object = Padrino::Mailer::MailObject.new({:to => "test@john.com", :from => "sender@sent.com", :body => "Hello"}, {})
9
+ Delivery.expects(:mail).with(:to => "test@john.com", :from => "sender@sent.com", :body => "Hello", :via => :sendmail)
10
+ mail_object.deliver
11
+ end
12
+
13
+ should "send mail with attributes default to smtp if set" do
14
+ mail_object = Padrino::Mailer::MailObject.new({:to => "test@john.com", :body => "Hello"}, { :host => 'smtp.gmail.com' })
15
+ Delivery.expects(:mail).with(:to => "test@john.com", :body => "Hello", :via => :smtp, :smtp => { :host => 'smtp.gmail.com' })
16
+ mail_object.deliver
17
+ end
18
+
19
+ should "send mail with attributes use sendmail if explicit" do
20
+ mail_object = Padrino::Mailer::MailObject.new({:to => "test@john.com", :via => :sendmail }, { :host => 'smtp.gmail.com' })
21
+ Delivery.expects(:mail).with(:to => "test@john.com", :via => :sendmail)
22
+ mail_object.deliver
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,82 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class DemoMailer < Padrino::Mailer::Base
4
+ def sample_mail
5
+ from 'test@default.com'
6
+ to 'test@test.com'
7
+ body "Hello world!"
8
+ via :sendmail
9
+ end
10
+
11
+ def sample_mail_smtp
12
+ from 'test@default.com'
13
+ to 'test@test.com'
14
+ body "SMTP Hello world!"
15
+ end
16
+ end
17
+
18
+ class TestMailerBase < Test::Unit::TestCase
19
+ include Padrino::Mailer
20
+
21
+ context 'for defining email attributes' do
22
+ DemoMailer.mail_fields.each do |field|
23
+ should "support setting '#{field}' attribute" do
24
+ demo_mailer = DemoMailer.new(:sample_mail)
25
+ demo_mailer.send(field, "some_value")
26
+ assert_equal({ field => "some_value" }, demo_mailer.mail_attributes)
27
+ end
28
+ end
29
+
30
+ should "allow defining text body" do
31
+ demo_mailer = DemoMailer.new(:sample_mail)
32
+ demo_mailer.body("Hello world!")
33
+ assert_equal({ :body => "Hello world!" }, demo_mailer.mail_attributes)
34
+ end
35
+ end
36
+
37
+ context 'for retrieving template path' do
38
+ should "return correct path" do
39
+ demo_mailer = DemoMailer.new(:sample_mail)
40
+ assert_match %r{demo_mailer/sample_mail.erb}, demo_mailer.template_path
41
+ end
42
+ end
43
+
44
+ context 'for #deliver class method' do
45
+ should "perform the email delivery for sendmail" do
46
+ Delivery.expects(:mail).with(:from => 'test@default.com', :to => 'test@test.com', :body => "Hello world!", :via => :sendmail)
47
+ DemoMailer.deliver(:sample_mail)
48
+ end
49
+
50
+ should "perform the email delivery for smtp" do
51
+ DemoMailer.smtp_settings = { :host => 'smtp.arcadic.com' }
52
+ Delivery.expects(:mail).with(:from => 'test@default.com', :to => 'test@test.com',
53
+ :body => "SMTP Hello world!", :via => :smtp, :smtp => { :host => 'smtp.arcadic.com' })
54
+ DemoMailer.deliver(:sample_mail_smtp)
55
+ end
56
+ end
57
+
58
+ context 'for #respond_to? class method' do
59
+ should "respond as true for any delivery method calls for mails that exist" do
60
+ assert DemoMailer.respond_to?(:deliver_sample_mail)
61
+ end
62
+
63
+ should "respond as false for any delivery method calls for mails that don't exist" do
64
+ assert_equal false, DemoMailer.respond_to?(:deliver_faker_mail)
65
+ end
66
+
67
+ should "respond as true for any non-delivery methods that exist" do
68
+ assert DemoMailer.respond_to?(:inspect)
69
+ end
70
+
71
+ should "respond as false for any non-delivery methods that don't exist" do
72
+ assert_equal false, DemoMailer.respond_to?(:fake_method)
73
+ end
74
+ end
75
+
76
+ context 'for #method_missing dynamic delivery' do
77
+ should 'invoke deliver method with appropriate parameters' do
78
+ DemoMailer.expects(:deliver).with("example_name", "test", 5)
79
+ DemoMailer.deliver_example_name("test", 5)
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,33 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+ require File.dirname(__FILE__) + '/fixtures/mailer_app/app'
3
+
4
+ class TestPadrinoMailer < Test::Unit::TestCase
5
+ def app
6
+ MailerDemo.tap { |app| app.set :environment, :test }
7
+ end
8
+
9
+ context 'for mail delivery in sample application' do
10
+ setup { MailerDemo::SampleMailer.smtp_settings = MailerDemo.smtp_settings }
11
+
12
+ should 'be able to deliver plain text emails' do
13
+ assert_email_sent(:to => 'john@fake.com', :from => 'noreply@birthday.com', :via => :smtp,
14
+ :subject => "Happy Birthday!", :body => "Happy Birthday Joey! \nYou are turning 21")
15
+ visit '/deliver/plain', :post
16
+ assert_equal 'mail delivered', last_response.body
17
+ end
18
+
19
+ should 'be able to deliver html emails' do
20
+ assert_email_sent(:to => 'julie@fake.com', :from => 'noreply@anniversary.com', :type => 'html', :via => :smtp,
21
+ :subject => "Happy anniversary!", :body => "<p>Yay Joey & Charlotte!</p>\n<p>You have been married 16 years</p>")
22
+ visit '/deliver/html', :post
23
+ assert_equal 'mail delivered', last_response.body
24
+ end
25
+ end
26
+
27
+ protected
28
+
29
+ def assert_email_sent(mail_attributes)
30
+ delivery_attributes = mail_attributes.merge(:smtp => MailerDemo.smtp_settings)
31
+ Padrino::Mailer::MailObject.any_instance.expects(:send_mail).with(delivery_attributes).once.returns(true)
32
+ end
33
+ end
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: padrino-mailer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Padrino Team
8
+ - Nathan Esquenazi
9
+ - Davide D'Agostino
10
+ - Arthur Chiu
11
+ autorequire:
12
+ bindir: bin
13
+ cert_chain: []
14
+
15
+ date: 2009-11-16 00:00:00 -08:00
16
+ default_executable:
17
+ dependencies:
18
+ - !ruby/object:Gem::Dependency
19
+ name: sinatra
20
+ type: :runtime
21
+ version_requirement:
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.9.2
27
+ version:
28
+ - !ruby/object:Gem::Dependency
29
+ name: tilt
30
+ type: :runtime
31
+ version_requirement:
32
+ version_requirements: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: "0.2"
37
+ version:
38
+ - !ruby/object:Gem::Dependency
39
+ name: shoulda
40
+ type: :development
41
+ version_requirement:
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ version:
48
+ - !ruby/object:Gem::Dependency
49
+ name: haml
50
+ type: :development
51
+ version_requirement:
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 2.2.1
57
+ version:
58
+ - !ruby/object:Gem::Dependency
59
+ name: mocha
60
+ type: :development
61
+ version_requirement:
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 0.9.7
67
+ version:
68
+ - !ruby/object:Gem::Dependency
69
+ name: rack-test
70
+ type: :development
71
+ version_requirement:
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: 0.5.0
77
+ version:
78
+ - !ruby/object:Gem::Dependency
79
+ name: webrat
80
+ type: :development
81
+ version_requirement:
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: 0.5.1
87
+ version:
88
+ description: Mailer system for padrino allowing easy delivery of application emails
89
+ email: nesquena@gmail.com
90
+ executables: []
91
+
92
+ extensions: []
93
+
94
+ extra_rdoc_files:
95
+ - LICENSE
96
+ - README.rdoc
97
+ files:
98
+ - .document
99
+ - .gitignore
100
+ - LICENSE
101
+ - README.rdoc
102
+ - Rakefile
103
+ - VERSION
104
+ - lib/padrino-mailer.rb
105
+ - lib/padrino-mailer/base.rb
106
+ - lib/padrino-mailer/delivery.rb
107
+ - lib/padrino-mailer/mail_object.rb
108
+ - padrino-mailer.gemspec
109
+ - test/active_support_helpers.rb
110
+ - test/fixtures/mailer_app/app.rb
111
+ - test/fixtures/mailer_app/views/demo_mailer/sample_mail.erb
112
+ - test/fixtures/mailer_app/views/sample_mailer/anniversary_message.erb
113
+ - test/fixtures/mailer_app/views/sample_mailer/birthday_message.erb
114
+ - test/helper.rb
115
+ - test/test_mail_object.rb
116
+ - test/test_mailer_base.rb
117
+ - test/test_padrino_mailer.rb
118
+ has_rdoc: true
119
+ homepage: http://github.com/padrino/padrino-mailer
120
+ licenses: []
121
+
122
+ post_install_message:
123
+ rdoc_options:
124
+ - --charset=UTF-8
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: "0"
132
+ version:
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: "0"
138
+ version:
139
+ requirements: []
140
+
141
+ rubyforge_project:
142
+ rubygems_version: 1.3.5
143
+ signing_key:
144
+ specification_version: 3
145
+ summary: Mailer system for padrino
146
+ test_files:
147
+ - test/active_support_helpers.rb
148
+ - test/fixtures/mailer_app/app.rb
149
+ - test/helper.rb
150
+ - test/test_mail_object.rb
151
+ - test/test_mailer_base.rb
152
+ - test/test_padrino_mailer.rb