actionmailer_inline_css 1.0.3 → 1.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/README.md CHANGED
@@ -54,40 +54,18 @@ To use this in your Rails app, simply add `gem "actionmailer_inline_css"` to you
54
54
  (Having said that, it is recommended that you write your text templates by hand.)
55
55
 
56
56
 
57
- ### Additional Helpers
57
+ ### Including CSS in Mail Templates
58
58
 
59
- Rails does not provide any helpers for adding 'embedded' CSS to your layouts (and rightly so!),
60
- but the following helper is now available for your mail layouts:
61
-
62
- <tt>embedded_style_tag(file = mailer.mailer_name)</tt>
63
-
64
- * Embeds CSS loaded from a file, in a <tt>style</tt> tag.
65
- * File can be given with or without .css extension
66
- * Default path for mailer css files is <tt>public/stylesheets/mailers/#{mailer_name}.css</tt>
59
+ You can use the `stylesheet_link_tag` helper to add stylesheets to your mailer layouts.
60
+ <tt>actionmailer_inline_css</tt> contains a <tt>premailer</tt> override that properly handles
61
+ these CSS URIs.
67
62
 
68
63
  #### Example
69
64
 
70
- Given a mailer called <tt>BuildMailer</tt>, you can add the following
71
- line to the `<head>` section of <tt>app/views/layouts/build_mailer.html.erb</tt>:
72
-
73
- <%= embedded_style_tag %>
74
-
75
- This will embed the CSS found at <tt>public/stylesheets/mailers/build_mailer.css</tt>.
76
-
77
- --------------------------
78
-
79
- If you wanted to include different CSS for each mail template, you could do something like this:
80
-
81
- <% content_for 'head' do %>
82
- <%= embedded_style_tag 'error_notification' %>
83
- <% end %>
84
-
65
+ Add the following line to the `<head>` section of <tt>app/views/layouts/build_mailer.html.erb</tt>:
85
66
 
86
- ## Other Notes
67
+ <%= stylesheet_link_tag 'mailers/build_mailer' %>
87
68
 
88
- It may seem like a waste of resources to generate HTML, then parse it with Nokogiri,
89
- alter it, and finally re-render it. However, there is simply no other way to do it.
90
- ERB templates contain HTML tags in plain text, so the output must be parsed.
91
- On-the-fly CSS inlining could theoretically be built for Haml templates,
92
- but it would be far too much effort for such a small use-case.
69
+ This will add a stylesheet link for <tt>/stylesheets/mailers/build_mailer.css</tt>.
70
+ Premailer will then inline the CSS from that file, and remove the link tag.
93
71
 
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "actionmailer_inline_css"
3
- s.version = "1.0.3"
3
+ s.version = "1.1.0"
4
4
  s.date = Time.now.strftime('%Y-%m-%d')
5
5
  s.summary = "Always send HTML e-mails with inline CSS, using the 'premailer' gem"
6
6
  s.email = "[email protected]"
@@ -1,8 +1,7 @@
1
1
  require 'premailer'
2
2
  require 'nokogiri'
3
3
  require 'action_mailer/inline_css_hook'
4
- require 'action_mailer/inline_css_helper'
4
+ require 'overrides/premailer/premailer'
5
5
 
6
6
  ActionMailer::Base.register_interceptor ActionMailer::InlineCssHook
7
- ActionMailer::Base.send :helper, ActionMailer::InlineCssHelper
8
7
 
@@ -0,0 +1,19 @@
1
+ require 'premailer'
2
+
3
+ Premailer.class_eval do
4
+ protected
5
+ # When using the 'stylesheet_link_tag' helper in Rails, css URIs are given with
6
+ # a leading slash and a cache buster (e.g. ?12412422).
7
+ # This override handles these cases, while falling back to the default implementation.
8
+ def load_css_from_local_file_with_rails_path!(path)
9
+ rails_path = Rails.root.join("public", path.sub(/\?[0-9a-zA-Z]+$/, '').sub(/^\//, '')).to_s
10
+ if File.exist?(rails_path)
11
+ load_css_from_string(File.read(rails_path))
12
+ else
13
+ load_css_from_local_file_without_rails_path!(path)
14
+ end
15
+ end
16
+ alias_method_chain :load_css_from_local_file!, :rails_path
17
+
18
+ end
19
+
@@ -1,3 +1,7 @@
1
+ #
2
+ # Copied from rails/actionmailer/test/abstract_unit.rb
3
+ # --------------------------------------------------------------
4
+
1
5
  # Pathname has a warning, so require it first while silencing
2
6
  # warnings to shut it up.
3
7
  #
@@ -79,7 +83,7 @@ class Rails
79
83
  class << self
80
84
  def root; self; end
81
85
  def join(*args); self; end
82
- def to_s; "path"; end
86
+ def to_s; "PATH"; end
83
87
  end
84
88
  end
85
89
 
@@ -1,11 +1,6 @@
1
1
  require 'abstract_unit'
2
2
 
3
- class HelperMailer < ActionMailer::Base
4
- helper ActionMailer::InlineCssHelper
5
-
6
- def use_inline_css_hook
7
- mail_with_defaults do |format|
8
- format.html { render(:inline => %Q{
3
+ TEST_HTML = %Q{
9
4
  <html>
10
5
  <head>
11
6
  <style>
@@ -15,9 +10,19 @@ class HelperMailer < ActionMailer::Base
15
10
  <body>
16
11
  <div id="test">Test</div>
17
12
  </body>
18
- </html>
19
- }) }
20
- format.text { render(:inline => "Text Part") }
13
+ </html>}
14
+
15
+ class HelperMailer < ActionMailer::Base
16
+ def use_inline_css_hook_with_only_html_part
17
+ mail_with_defaults do |format|
18
+ format.html { render(:inline => TEST_HTML) }
19
+ end
20
+ end
21
+
22
+ def use_inline_css_hook_with_text_and_html_parts
23
+ mail_with_defaults do |format|
24
+ format.html { render(:inline => TEST_HTML) }
25
+ format.text { render(:inline => "Different Text Part") }
21
26
  end
22
27
  end
23
28
 
@@ -29,10 +34,20 @@ class HelperMailer < ActionMailer::Base
29
34
  end
30
35
  end
31
36
 
37
+
32
38
  class InlineCssHookTest < ActionMailer::TestCase
33
- def test_inline_css_hook
34
- mail = HelperMailer.use_inline_css_hook.deliver
39
+ def test_inline_css_hook_with_only_html_part
40
+ mail = HelperMailer.use_inline_css_hook_with_only_html_part.deliver
41
+ assert_match '<div id="test" style="color: #123456;">Test</div>', mail.html_part.body.encoded
42
+ # Test generated text part
43
+ assert_match 'Test', mail.text_part.body.encoded
44
+ end
45
+
46
+ def test_inline_css_hook_with_text_and_html_parts
47
+ mail = HelperMailer.use_inline_css_hook_with_text_and_html_parts.deliver
35
48
  assert_match '<div id="test" style="color: #123456;">Test</div>', mail.html_part.body.encoded
49
+ # Test specified text part
50
+ assert_match 'Different Text Part', mail.text_part.body.encoded
36
51
  end
37
52
  end
38
53
 
@@ -0,0 +1,39 @@
1
+ require 'abstract_unit'
2
+
3
+ ENV["RAILS_ASSET_ID"] = "123456"
4
+
5
+ class HelperMailer < ActionMailer::Base
6
+ def use_stylesheet_link_tag
7
+ mail_with_defaults do |format|
8
+ format.html { render(:inline => %Q{
9
+ <html>
10
+ <head>
11
+ <%= stylesheet_link_tag 'mailers/mailer' %>
12
+ </head>
13
+ <body>
14
+ <div class="test">Test</div>
15
+ </body>
16
+ </html>
17
+ }) }
18
+ end
19
+ end
20
+
21
+ protected
22
+
23
+ def mail_with_defaults(&block)
24
+ mail(:to => "test@localhost", :from => "[email protected]",
25
+ :subject => "using helpers", &block)
26
+ end
27
+ end
28
+
29
+ class PremailerStylesheetLinkTagTest < ActionMailer::TestCase
30
+ def test_premailer_stylesheet_link_tag
31
+ css_file = "div.test { color: #119911; }"
32
+ File.stubs(:exist?).returns(true)
33
+ File.stubs(:read).returns(css_file)
34
+
35
+ mail = HelperMailer.use_stylesheet_link_tag.deliver
36
+ assert_match "<div class=\"test\" style=\"color: #119911;\">", mail.html_part.body.encoded
37
+ end
38
+ end
39
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: actionmailer_inline_css
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2011-09-13 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionmailer
16
- requirement: &15951960 !ruby/object:Gem::Requirement
16
+ requirement: &23025380 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 3.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *15951960
24
+ version_requirements: *23025380
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: premailer
27
- requirement: &15951440 !ruby/object:Gem::Requirement
27
+ requirement: &23024840 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.7.1
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *15951440
35
+ version_requirements: *23024840
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: nokogiri
38
- requirement: &15818220 !ruby/object:Gem::Requirement
38
+ requirement: &23024260 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.4.4
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *15818220
46
+ version_requirements: *23024260
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: mocha
49
- requirement: &15817740 !ruby/object:Gem::Requirement
49
+ requirement: &23023760 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: 0.10.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *15817740
57
+ version_requirements: *23023760
58
58
  description: Module for ActionMailer to improve the rendering of HTML emails by using
59
59
  the 'premailer' gem, which inlines CSS and makes relative links absolute.
60
60
  email: [email protected]
@@ -67,12 +67,12 @@ files:
67
67
  - README.md
68
68
  - Rakefile
69
69
  - actionmailer_inline_css.gemspec
70
- - lib/action_mailer/inline_css_helper.rb
71
70
  - lib/action_mailer/inline_css_hook.rb
72
71
  - lib/actionmailer_inline_css.rb
72
+ - lib/overrides/premailer/premailer.rb
73
73
  - test/abstract_unit.rb
74
- - test/inline_css_helper_test.rb
75
74
  - test/inline_css_hook_test.rb
75
+ - test/premailer_stylesheet_link_tag_test.rb
76
76
  homepage: http://premailer.dialect.ca/
77
77
  licenses: []
78
78
  post_install_message:
@@ -87,7 +87,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
87
87
  version: '0'
88
88
  segments:
89
89
  - 0
90
- hash: -1512887497751665596
90
+ hash: 4032464049642912323
91
91
  required_rubygems_version: !ruby/object:Gem::Requirement
92
92
  none: false
93
93
  requirements:
@@ -96,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
96
96
  version: '0'
97
97
  segments:
98
98
  - 0
99
- hash: -1512887497751665596
99
+ hash: 4032464049642912323
100
100
  requirements: []
101
101
  rubyforge_project:
102
102
  rubygems_version: 1.8.8
@@ -1,20 +0,0 @@
1
- module ActionMailer
2
- module InlineCssHelper
3
- # Embed CSS loaded from a file in a 'style' tag.
4
- # CSS file can be given with or without .css extension,
5
- # and will be searched for in "#{Rails.root}/public/stylesheets/mailers" by default.
6
- def embedded_style_tag(file = mailer.mailer_name)
7
- ['.css', ''].each do |ext|
8
- [Rails.root.join("public", "stylesheets", "mailers"), Rails.root].each do |parent_path|
9
- guessed_path = parent_path.join(file+ext).to_s
10
- if File.exist?(guessed_path)
11
- return content_tag(:style, File.read(guessed_path), {:type => "text/css"}, false)
12
- end
13
- end
14
- end
15
- nil
16
- end
17
-
18
- end
19
- end
20
-
@@ -1,29 +0,0 @@
1
- require 'abstract_unit'
2
-
3
- class HelperMailer < ActionMailer::Base
4
- helper ActionMailer::InlineCssHelper
5
-
6
- def use_embedded_style_tag
7
- mail_with_defaults do |format|
8
- format.html { render(:inline => "<%= embedded_style_tag %>") }
9
- end
10
- end
11
-
12
- protected
13
-
14
- def mail_with_defaults(&block)
15
- mail(:to => "test@localhost", :from => "[email protected]",
16
- :subject => "using helpers", &block)
17
- end
18
- end
19
-
20
- class InlineCssHelperTest < ActionMailer::TestCase
21
- def test_embedded_style_tag
22
- css = "body { display: none; }"
23
- File.stubs(:exist?).returns(true)
24
- File.stubs(:read).returns(css)
25
- mail = HelperMailer.use_embedded_style_tag
26
- assert_match "<style type=\"text/css\">#{css}</style>", mail.body.encoded
27
- end
28
- end
29
-
OSZAR »