Skip to content

Commit

Permalink
use autoload instead of explicit requires for ActionMailer
Browse files Browse the repository at this point in the history
  • Loading branch information
josh committed Nov 23, 2008
1 parent 04d2d04 commit e201fc7
Show file tree
Hide file tree
Showing 10 changed files with 63 additions and 47 deletions.
38 changes: 24 additions & 14 deletions actionmailer/lib/action_mailer.rb
Expand Up @@ -31,22 +31,32 @@
end
end

require 'action_mailer/vendor'
require 'tmail'

require 'action_mailer/base'
require 'action_mailer/helpers'
require 'action_mailer/mail_helper'
require 'action_mailer/quoting'
require 'action_mailer/test_helper'
module ActionMailer
def self.load_all!
[Base, Part, ::Text::Format, ::Net::SMTP]
end

require 'net/smtp'
autoload :AdvAttrAccessor, 'action_mailer/adv_attr_accessor'
autoload :Base, 'action_mailer/base'
autoload :Helpers, 'action_mailer/helpers'
autoload :Part, 'action_mailer/part'
autoload :PartContainer, 'action_mailer/part_container'
autoload :Quoting, 'action_mailer/quoting'
autoload :TestCase, 'action_mailer/test_case'
autoload :TestHelper, 'action_mailer/test_helper'
autoload :Utils, 'action_mailer/utils'
end

ActionMailer::Base.class_eval do
include ActionMailer::Quoting
include ActionMailer::Helpers
module Text
autoload :Format, 'action_mailer/vendor/text_format'
end

helper MailHelper
module Net
autoload :SMTP, 'net/smtp'
end

silence_warnings { TMail::Encoder.const_set("MAX_LINE_LEN", 200) }
autoload :MailHelper, 'action_mailer/mail_helper'
autoload :TMail, 'action_mailer/vendor/tmail'

# TODO: Don't explicitly load entire lib
ActionMailer.load_all!
15 changes: 8 additions & 7 deletions actionmailer/lib/action_mailer/base.rb
@@ -1,7 +1,3 @@
require 'action_mailer/adv_attr_accessor'
require 'action_mailer/part'
require 'action_mailer/part_container'
require 'action_mailer/utils'
require 'tmail/net'

module ActionMailer #:nodoc:
Expand Down Expand Up @@ -245,7 +241,7 @@ module ActionMailer #:nodoc:
# and appear last in the mime encoded message. You can also pick a different order from inside a method with
# +implicit_parts_order+.
class Base
include AdvAttrAccessor, PartContainer
include AdvAttrAccessor, PartContainer, Quoting, Utils
if Object.const_defined?(:ActionController)
include ActionController::UrlWriter
include ActionController::Layout
Expand Down Expand Up @@ -648,11 +644,11 @@ def create_mail

if @parts.empty?
m.set_content_type(real_content_type, nil, ctype_attrs)
m.body = Utils.normalize_new_lines(body)
m.body = normalize_new_lines(body)
else
if String === body
part = TMail::Mail.new
part.body = Utils.normalize_new_lines(body)
part.body = normalize_new_lines(body)
part.set_content_type(real_content_type, nil, ctype_attrs)
part.set_content_disposition "inline"
m.parts << part
Expand Down Expand Up @@ -698,4 +694,9 @@ def perform_delivery_test(mail)
deliveries << mail
end
end

Base.class_eval do
include Helpers
helper MailHelper
end
end
2 changes: 0 additions & 2 deletions actionmailer/lib/action_mailer/mail_helper.rb
@@ -1,5 +1,3 @@
require 'text/format'

module MailHelper
# Uses Text::Format to take the text and format it, indented two spaces for
# each line, and wrapped at 72 columns.
Expand Down
10 changes: 2 additions & 8 deletions actionmailer/lib/action_mailer/part.rb
@@ -1,15 +1,10 @@
require 'action_mailer/adv_attr_accessor'
require 'action_mailer/part_container'
require 'action_mailer/utils'

module ActionMailer
# Represents a subpart of an email message. It shares many similar
# attributes of ActionMailer::Base. Although you can create parts manually
# and add them to the +parts+ list of the mailer, it is easier
# to use the helper methods in ActionMailer::PartContainer.
class Part
include ActionMailer::AdvAttrAccessor
include ActionMailer::PartContainer
include AdvAttrAccessor, PartContainer, Utils

# Represents the body of the part, as a string. This should not be a
# Hash (like ActionMailer::Base), but if you want a template to be rendered
Expand Down Expand Up @@ -64,7 +59,7 @@ def to_mail(defaults)
when "base64" then
part.body = TMail::Base64.folding_encode(body)
when "quoted-printable"
part.body = [Utils.normalize_new_lines(body)].pack("M*")
part.body = [normalize_new_lines(body)].pack("M*")
else
part.body = body
end
Expand Down Expand Up @@ -102,7 +97,6 @@ def to_mail(defaults)
end

private

def squish(values={})
values.delete_if { |k,v| v.nil? }
end
Expand Down
2 changes: 1 addition & 1 deletion actionmailer/lib/action_mailer/test_case.rb
Expand Up @@ -10,7 +10,7 @@ def initialize(name)
end

class TestCase < ActiveSupport::TestCase
include ActionMailer::Quoting
include Quoting, TestHelper

setup :initialize_test_deliveries
setup :set_expected_mail
Expand Down
1 change: 1 addition & 0 deletions actionmailer/lib/action_mailer/test_helper.rb
Expand Up @@ -58,6 +58,7 @@ def assert_no_emails(&block)
end
end

# TODO: Deprecate this
module Test
module Unit
class TestCase
Expand Down
1 change: 0 additions & 1 deletion actionmailer/lib/action_mailer/utils.rb
Expand Up @@ -3,6 +3,5 @@ module Utils #:nodoc:
def normalize_new_lines(text)
text.to_s.gsub(/\r\n?/, "\n")
end
module_function :normalize_new_lines
end
end
14 changes: 0 additions & 14 deletions actionmailer/lib/action_mailer/vendor.rb

This file was deleted.

10 changes: 10 additions & 0 deletions actionmailer/lib/action_mailer/vendor/text_format.rb
@@ -0,0 +1,10 @@
# Prefer gems to the bundled libs.
require 'rubygems'

begin
gem 'text-format', '>= 0.6.3'
rescue Gem::LoadError
$:.unshift "#{File.dirname(__FILE__)}/text-format-0.6.3"
end

require 'text/format'
17 changes: 17 additions & 0 deletions actionmailer/lib/action_mailer/vendor/tmail.rb
@@ -0,0 +1,17 @@
# Prefer gems to the bundled libs.
require 'rubygems'

begin
gem 'tmail', '~> 1.2.3'
rescue Gem::LoadError
$:.unshift "#{File.dirname(__FILE__)}/tmail-1.2.3"
end

module TMail
end

require 'tmail'

silence_warnings do
TMail::Encoder.const_set("MAX_LINE_LEN", 200)
end

5 comments on commit e201fc7

@whatcould
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Had to comment out “require ‘tmail/net’ in actionmailer/base.rb” to get rails to start after this commit.

@methodmissing
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same here

@josh
Copy link
Contributor Author

@josh josh commented on e201fc7 Nov 23, 2008

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm, can’t seem to reproduce the issue. what exception is getting raised?

@whatcould
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. no such file to load — tmail/net (RuntimeError)

ActionMailer seems to work without it, interestingly enough.

@josh
Copy link
Contributor Author

@josh josh commented on e201fc7 Nov 23, 2008

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Jeremy just remove the line a few mins ago. It should be fine for now.

Please sign in to comment.