actionmailer-instyle 0.0.1

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.
Files changed (32) hide show
  1. data/.gitignore +20 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +3 -0
  4. data/Guardfile +17 -0
  5. data/LICENSE +22 -0
  6. data/README.md +51 -0
  7. data/Rakefile +8 -0
  8. data/actionmailer-instyle.gemspec +32 -0
  9. data/config.ru +7 -0
  10. data/lib/action_mailer/in_style.rb +21 -0
  11. data/lib/action_mailer/in_style/premailer.rb +34 -0
  12. data/lib/action_mailer/in_style/processor.rb +91 -0
  13. data/lib/action_mailer/in_style/version.rb +5 -0
  14. data/spec/internal/app/assets/stylesheets/notification_mailer.css.scss +9 -0
  15. data/spec/internal/app/mailers/notification_mailer.rb +18 -0
  16. data/spec/internal/app/mailers/notification_mailer_no_layout.rb +10 -0
  17. data/spec/internal/app/views/layouts/notification_mailer.html.erb +12 -0
  18. data/spec/internal/app/views/layouts/notification_mailer_without_style.html.erb +11 -0
  19. data/spec/internal/app/views/notification_mailer/email_with_html_only.html.erb +9 -0
  20. data/spec/internal/app/views/notification_mailer/welcome_html_email.html.erb +7 -0
  21. data/spec/internal/app/views/notification_mailer/welcome_html_email.text.erb +1 -0
  22. data/spec/internal/app/views/notification_mailer_no_style/email_with_no_style.html.erb +8 -0
  23. data/spec/internal/config/database.yml +3 -0
  24. data/spec/internal/config/routes.rb +3 -0
  25. data/spec/internal/db/schema.rb +3 -0
  26. data/spec/internal/log/.gitignore +1 -0
  27. data/spec/internal/public/favicon.ico +0 -0
  28. data/spec/lib/action_mailer/inline/css_helper_spec.rb +9 -0
  29. data/spec/lib/action_mailer/inline/processor_spec.rb +73 -0
  30. data/spec/lib/action_mailer/inline_spec.rb +48 -0
  31. data/spec/spec_helper.rb +24 -0
  32. metadata +195 -0
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .sass-cache
19
+
20
+ spec/internal/db/combustion_test.sqlite
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color -f d
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -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
+ # Rails example
10
+ watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
11
+ watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
12
+ watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
13
+ watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
14
+ end
15
+
16
+
17
+
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Ivan Vanderbyl
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.
@@ -0,0 +1,51 @@
1
+ # ActionMailer::InStyle
2
+
3
+ ![TestPilot Build Status](http://testpilot.me/testpilot/actionmailer-instyle.png)
4
+
5
+ HTML Email is hard, especially when you find yourself wrestling with inline CSS to make it look good, luckily for you we're here to make it easy, ActionMailer::InStyle
6
+ lets you write standard CSS, using Sass or the likes within the Rails 3.1 Asset Pipeline and automatically converts it to inline CSS using Premailer.
7
+
8
+ ## Requirements
9
+
10
+ This gem is built specifically to take advantage of the Rails 3.1 Asset Pipeline, as such you must be using Rails ~>3.1
11
+
12
+ _Additonally Ruby 1.8.7 is not supported due to favouring the Ruby 1.9 Hash syntax. If you want 1.8.7 support, issue a pull request._
13
+
14
+ ## Installation
15
+
16
+ Add this line to your application's Gemfile:
17
+
18
+ gem 'actionmailer-instyle'
19
+
20
+ And then execute:
21
+
22
+ $ bundle
23
+
24
+ ## Usage
25
+
26
+ Once installed it will add the required hooks out of the box.
27
+
28
+ *Stylesheets*
29
+
30
+ As with all your other stylesheets, put them in `app/assets/stylesheets` and include them into your mailer
31
+ template using `stylesheet_include_tag "account_mailer"`, where `account_mailer` is the filename less the extension of the stylesheet you want to
32
+ include.
33
+
34
+ Everything runs through the Asset Pipeline so you can use Sass simply by adding the `.scss` extension as you would with all other stylesheets.
35
+
36
+ *Compass*
37
+
38
+ Because Sass works out of the box, you can also include compass for browser specific mixins, keeping in mind that some email client (Outlook for example)
39
+ use very crappy rendering engines and some CSS properties may have undesired effects or not work at all.
40
+
41
+ For a complete rundown on what is supported, checkout this guide which CampaignMonitor has compiled.
42
+
43
+ (CampaignMonitor's guide to CSS support in email)[http://www.campaignmonitor.com/css/]
44
+
45
+ ## Contributing
46
+
47
+ 1. Fork it
48
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
49
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
50
+ 4. Push to the branch (`git push origin my-new-feature`)
51
+ 5. Create new Pull Request
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :default => :spec
8
+
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/action_mailer/in_style/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Ivan Vanderbyl"]
6
+ gem.email = ["ivanvanderbyl@me.com"]
7
+ gem.description = %q{Easily create HTML emails in Rails ~>3.1}
8
+ gem.summary = %q{This gem brings you the power of the premailer gem to Rails 3
9
+ without any configuration needs. Create HTML emails, include a
10
+ CSS file as you do in a normal HTML document and premailer will
11
+ inline the included CSS.}
12
+ gem.homepage = "http://github.com/testpilot/actionmailer-instyle"
13
+
14
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
15
+ gem.files = `git ls-files`.split("\n")
16
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ gem.name = "actionmailer-instyle"
18
+ gem.require_paths = ["lib"]
19
+ gem.version = ActionMailer::InStyle::VERSION
20
+
21
+ gem.add_dependency("premailer", ["~> 1.7"])
22
+ gem.add_dependency("rails", ["~> 3.1"])
23
+
24
+ gem.add_development_dependency 'rspec-rails', '~> 2.8.0'
25
+ gem.add_development_dependency 'guard-rspec'
26
+ gem.add_development_dependency 'sass', '~> 3.1'
27
+ gem.add_development_dependency 'sqlite3', '1.3.5'
28
+ gem.add_development_dependency 'mail'
29
+ gem.add_development_dependency 'nokogiri'
30
+ gem.add_development_dependency 'combustion', '~> 0.3.1'
31
+
32
+ end
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ Bundler.require :default, :development
5
+
6
+ Combustion.initialize!
7
+ run Combustion::Application
@@ -0,0 +1,21 @@
1
+ require "action_mailer/in_style/version"
2
+ require "action_mailer/base"
3
+
4
+ module ActionMailer
5
+ module InStyle
6
+ autoload :Processor, 'action_mailer/in_style/processor'
7
+ autoload :Premailer, 'action_mailer/in_style/premailer'
8
+
9
+ # delivering_email hook within Mail
10
+ #
11
+ # This is where the whole process kicks off.
12
+ def self.delivering_email(message)
13
+ # If the email contains a html part or is only html
14
+ if message.html_part || (message.content_type =~ /text\/html/ && message)
15
+ InStyle::Processor.inline!(message)
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ ActionMailer::Base.register_interceptor(ActionMailer::InStyle)
@@ -0,0 +1,34 @@
1
+ require 'premailer'
2
+ module ActionMailer
3
+ module InStyle
4
+ class Premailer < ::Premailer
5
+
6
+ def load_css_from_html!
7
+ load_css_from_asset_pipeline!
8
+ super
9
+ end
10
+
11
+ # Uses sprockets and the Rails ~>3.1 asset pipeline
12
+ # to load the compiled CSS from stylesheet links within the header of the
13
+ # email temoplate.
14
+ def load_css_from_asset_pipeline!
15
+ if tags = @doc.search("link[@rel='stylesheet'], style")
16
+ tags.each do |tag|
17
+ if tag.to_s.strip =~ /^\<link/i && tag.attributes['href'] && media_type_ok?(tag.attributes['media'])
18
+
19
+ # If the stylesheet link begins with /assets we must be using the asset pipeline
20
+ # to generate the css. In this case we should be able to retrieve the css directly
21
+ # from sprockets
22
+ if tag.attributes['href'].to_s =~ /\/assets\//
23
+ link_uri = tag.attributes['href'].to_s
24
+ asset = Rails.application.assets.find_asset(link_uri.sub(/\/assets\//, ''))
25
+ @css_parser.add_block!(asset.body) if asset
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,91 @@
1
+ require "premailer"
2
+
3
+ module ActionMailer
4
+ module InStyle
5
+ class Processor
6
+
7
+ def self.inline!(message)
8
+ new(message).inline!
9
+ end
10
+
11
+ attr_reader :message, :premailer
12
+
13
+ # Initialize
14
+ # Accepts one argument:
15
+ # - ActionMailer message object
16
+ def initialize(message)
17
+ @message = message
18
+
19
+ @existing_html_part = message.html_part || (message.content_type =~ /text\/html/ && message)
20
+ @premailer = ActionMailer::InStyle::Premailer.new(html_part.body.to_s, :with_html_string => true, :remove_classes => true)
21
+ end
22
+
23
+ def html_part
24
+ @existing_html_part
25
+ end
26
+
27
+ # InStyle!
28
+ # Processes the message object, replacing the html part with an inlined
29
+ # html version.
30
+ #
31
+ # If the message contains attachments or text parts, these parts are preserved.
32
+ # If the message does not contain a text part, one will be constructed from the text
33
+ # content available in the html part.
34
+ def inline!
35
+ capture_existing_message_parts
36
+ reset_message_body!
37
+
38
+ add_html_part!
39
+ add_text_part!
40
+ add_attachments!
41
+
42
+ message
43
+ end
44
+
45
+ # Add an HTML part with CSS inlined.
46
+ def add_html_part!
47
+ part = Mail::Part.new
48
+ part.body = premailer.to_inline_css
49
+ part.content_type = "text/html; charset=#{@msg_charset}"
50
+
51
+ message.add_part(part)
52
+ end
53
+
54
+ # Add a text part with either the pre-existing text part, or one generated with premailer.
55
+ def add_text_part!
56
+ part = Mail::Part.new
57
+ part.body = @existing_text_part || premailer.to_plain_text
58
+ part.content_type = "text/plain; charset=#{@msg_charset}"
59
+ message.add_part(part)
60
+ end
61
+
62
+ # Re-add any attachments
63
+ def add_attachments!
64
+ @existing_attachments.each {|a| message.body << a }
65
+ end
66
+
67
+ def capture_existing_message_parts
68
+ @existing_text_part = message.text_part && message.text_part.body.to_s
69
+ @existing_attachments = message.attachments
70
+ @msg_charset = message.charset
71
+ end
72
+
73
+ def original_message_parts
74
+ capture_existing_message_parts
75
+
76
+ {
77
+ html_part: html_part,
78
+ text_part: @existing_text_part,
79
+ attachments: @existing_attachments,
80
+ charset: @msg_charset
81
+ }
82
+ end
83
+
84
+ def reset_message_body!
85
+ message.body = nil
86
+ message.body.instance_variable_set("@parts", Mail::PartsList.new)
87
+ end
88
+
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,5 @@
1
+ module ActionMailer
2
+ module InStyle
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ body {
2
+ font-family: 'Helvetica Neue', Helvetica, Ariel, sans-serif;
3
+ font-size: 13px;
4
+ color: lighten(black, 30%);
5
+ }
6
+
7
+ table.striped {
8
+ width: 100%;
9
+ }
@@ -0,0 +1,18 @@
1
+ class NotificationMailer < ActionMailer::Base
2
+ layout "notification_mailer"
3
+
4
+ default from: "Johnny Quids<quidlicker@example.com>"
5
+
6
+ def welcome_email
7
+ mail(to: "archie@example.com", :subject => "We need dry ice")
8
+ end
9
+
10
+ def email_with_html_only
11
+ mail(to: "archie@example.com", :subject => "We need dry ice")
12
+ end
13
+
14
+ def welcome_html_email
15
+ mail(to: "archie@example.com", :subject => "We need dry ice")
16
+ end
17
+
18
+ end
@@ -0,0 +1,10 @@
1
+ class NotificationMailerNoStyle < ActionMailer::Base
2
+ layout "notification_mailer_without_style"
3
+
4
+ default from: "Johnny Quids<quidlicker@example.com>"
5
+
6
+ def email_with_no_style
7
+ mail(to: "archie@example.com", :subject => "We need dry ice")
8
+ end
9
+ end
10
+
@@ -0,0 +1,12 @@
1
+ <html>
2
+ <head>
3
+ <meta http-equiv="content-type" content="text/html; charset=utf-8">
4
+
5
+ <title>Notification_mailer.html</title>
6
+ <%= stylesheet_link_tag "notification_mailer" %>
7
+ </head>
8
+
9
+ <body>
10
+ <%= yield %>
11
+ </body>
12
+ </html>
@@ -0,0 +1,11 @@
1
+ <html>
2
+ <head>
3
+ <meta http-equiv="content-type" content="text/html; charset=utf-8">
4
+
5
+ <title>Notification_mailer.html</title>
6
+ </head>
7
+
8
+ <body>
9
+ <%= yield %>
10
+ </body>
11
+ </html>
@@ -0,0 +1,9 @@
1
+ <table class="striped">
2
+ <tr>
3
+ <td>
4
+ <p>Welcome, this is a HTML email</p>
5
+ <p>Another line</p>
6
+ </td>
7
+ </tr>
8
+ </table>
9
+
@@ -0,0 +1,7 @@
1
+ <table class="striped">
2
+ <tr>
3
+ <td>
4
+ Welcome, this is a HTML email
5
+ </td>
6
+ </tr>
7
+ </table>
@@ -0,0 +1,8 @@
1
+ <table class="striped">
2
+ <tr>
3
+ <td>
4
+ Welcome, this is a HTML email
5
+ </td>
6
+ </tr>
7
+ </table>
8
+
@@ -0,0 +1,3 @@
1
+ test:
2
+ adapter: sqlite3
3
+ database: db/combustion_test.sqlite
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ #
3
+ end
@@ -0,0 +1,3 @@
1
+ ActiveRecord::Schema.define do
2
+ #
3
+ end
@@ -0,0 +1 @@
1
+ *.log
File without changes
@@ -0,0 +1,9 @@
1
+ require "spec_helper"
2
+
3
+ describe ActionMailer::InStyle do
4
+ describe "CSS" do
5
+ it "Should return a CSS String" do
6
+ Rails.application.assets.find_asset('notification_mailer.css.scss').body.should match /font-family: 'Helvetica Neue', Helvetica, Ariel, sans-serif/
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,73 @@
1
+ require "spec_helper"
2
+
3
+ describe ActionMailer::InStyle::Processor do
4
+
5
+ before do
6
+ ActionMailer::InStyle.stub(:delivering_email).and_return(message)
7
+ end
8
+
9
+ let(:message) { NotificationMailer.welcome_html_email.deliver }
10
+ let(:processor) { ActionMailer::InStyle::Processor.new(message) }
11
+
12
+ describe :message do
13
+ it "should have a html part" do
14
+ message.html_part.should_not be_nil
15
+ end
16
+ end
17
+
18
+ it "should initialize with a message object" do
19
+ processor.message.should == message
20
+ end
21
+
22
+ it "should reset message body so we can replace it with the processed body" do
23
+ processor.message.should_receive(:body=).with(nil).once
24
+ processor.reset_message_body!
25
+ end
26
+
27
+ it "captures original html part" do
28
+ processor.original_message_parts[:html_part].should be_a Mail::Part
29
+ end
30
+
31
+ it "captures original text part" do
32
+ processor.original_message_parts[:text_part].should be_a String
33
+ end
34
+
35
+ it "captures original attachments" do
36
+ processor.original_message_parts[:attachments].should be_empty
37
+ end
38
+
39
+ it "captures message charset" do
40
+ processor.original_message_parts[:charset].should == 'UTF-8'
41
+ end
42
+
43
+ describe 'message' do
44
+ it 'should have two parts' do
45
+ message.parts.size.should == 2
46
+ end
47
+ end
48
+
49
+ describe 'html part' do
50
+ def parse_html_to_doc(html)
51
+ Nokogiri::HTML(html)
52
+ end
53
+
54
+ it 'should have a html part' do
55
+ processor.html_part.should be_a Mail::Part
56
+ processor.html_part.body.should_not be_nil
57
+ end
58
+
59
+ it 'should include asset path for stylesheet in header' do
60
+ processor.html_part.body.should match /\<link(.+)href\=\"\/assets\/notification_mailer\.css\"(.+)\>/
61
+ end
62
+
63
+ it 'should have inlined css version without stylesheet links' do
64
+ processor.premailer.to_inline_css.should_not match /\<link(.+)href\=\"\/assets\/notification_mailer\.css\"(.+)\>/
65
+ end
66
+
67
+ it 'replaces html body with inlined css version' do
68
+ processor.inline!
69
+ processor.html_part.body.should_not be_nil
70
+ parse_html_to_doc(processor.premailer.to_inline_css).css('body')[0].attributes['style'].to_s.should == "font-family: 'Helvetica Neue', Helvetica, Ariel, sans-serif; font-size: 13px; color: #4d4d4d;"
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,48 @@
1
+ require "spec_helper"
2
+
3
+ describe ActionMailer::InStyle do
4
+ it "is included in Mail interceptors" do
5
+ Mail.class_variable_get("@@delivery_interceptors").should include ActionMailer::InStyle
6
+ end
7
+
8
+ let(:original_message) { NotificationMailer.welcome_html_email.deliver }
9
+ let(:message) { ActionMailer::InStyle.delivering_email(original_message) }
10
+
11
+ it "should keep text version of email if present" do
12
+ original_message.text_part.body.to_s.should == message.text_part.body.to_s
13
+ end
14
+
15
+ it "should have two body parts" do
16
+ message.parts.size.should == 2
17
+ end
18
+
19
+ it "should not have a style tag in original email" do
20
+ ActionMailer::InStyle.should_receive(:delivering_email).once
21
+ original_message = NotificationMailer.welcome_html_email.deliver
22
+ Nokogiri::HTML(original_message.html_part.body.to_s).css('body').first.attributes['style'].should be_nil
23
+ end
24
+
25
+ it "should replace html version with premailer processed inline version" do
26
+ # If it has a style attribue then we have processed it
27
+ Nokogiri::HTML(message.html_part.body.to_s).css('body').first.attributes['style'].should_not be_nil
28
+ end
29
+
30
+ it "should find stylesheet assets" do
31
+
32
+ end
33
+
34
+ it "should not do anything if no stylesheets are present" do
35
+ message_with_no_css = ActionMailer::InStyle.delivering_email(NotificationMailerNoStyle.email_with_no_style.deliver)
36
+ Nokogiri::HTML(message_with_no_css.html_part.body.to_s).css('body').first.attributes['style'].should be_nil
37
+ end
38
+
39
+ it "should inline stylesheets and replace IDs and Classes" do
40
+ # According to the email template the first table usually has a 'striped' class
41
+ Nokogiri::HTML(message.html_part.body.to_s).css('table').first.attributes['class'].should be_nil
42
+ end
43
+
44
+ it "should create a text part from the html part if not present" do
45
+ message = ActionMailer::InStyle.delivering_email(NotificationMailer.email_with_html_only.deliver)
46
+ message.text_part.body.to_s.should == "Welcome, this is a HTML email\n\nAnother line"
47
+ end
48
+ end
@@ -0,0 +1,24 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ Bundler.require
5
+
6
+ require "rails"
7
+ require "combustion"
8
+
9
+ Combustion.initialize!
10
+
11
+ require 'rspec/rails'
12
+
13
+ require 'nokogiri'
14
+ require "combustion"
15
+
16
+ require 'action_mailer/in_style'
17
+
18
+ RSpec.configure do |config|
19
+ config.mock_with :rspec
20
+
21
+ config.before do
22
+ ActionMailer::Base.delivery_method = :test
23
+ end
24
+ end
metadata ADDED
@@ -0,0 +1,195 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: actionmailer-instyle
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ivan Vanderbyl
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: premailer
16
+ requirement: &70322805055240 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.7'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70322805055240
25
+ - !ruby/object:Gem::Dependency
26
+ name: rails
27
+ requirement: &70322805054720 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '3.1'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70322805054720
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec-rails
38
+ requirement: &70322805054260 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 2.8.0
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70322805054260
47
+ - !ruby/object:Gem::Dependency
48
+ name: guard-rspec
49
+ requirement: &70322805053880 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70322805053880
58
+ - !ruby/object:Gem::Dependency
59
+ name: sass
60
+ requirement: &70322805053340 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: '3.1'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70322805053340
69
+ - !ruby/object:Gem::Dependency
70
+ name: sqlite3
71
+ requirement: &70322805052840 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - =
75
+ - !ruby/object:Gem::Version
76
+ version: 1.3.5
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70322805052840
80
+ - !ruby/object:Gem::Dependency
81
+ name: mail
82
+ requirement: &70322805052460 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *70322805052460
91
+ - !ruby/object:Gem::Dependency
92
+ name: nokogiri
93
+ requirement: &70322805052000 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *70322805052000
102
+ - !ruby/object:Gem::Dependency
103
+ name: combustion
104
+ requirement: &70322938609240 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 0.3.1
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *70322938609240
113
+ description: Easily create HTML emails in Rails ~>3.1
114
+ email:
115
+ - ivanvanderbyl@me.com
116
+ executables: []
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - .gitignore
121
+ - .rspec
122
+ - Gemfile
123
+ - Guardfile
124
+ - LICENSE
125
+ - README.md
126
+ - Rakefile
127
+ - actionmailer-instyle.gemspec
128
+ - config.ru
129
+ - lib/action_mailer/in_style.rb
130
+ - lib/action_mailer/in_style/premailer.rb
131
+ - lib/action_mailer/in_style/processor.rb
132
+ - lib/action_mailer/in_style/version.rb
133
+ - spec/internal/app/assets/stylesheets/notification_mailer.css.scss
134
+ - spec/internal/app/mailers/notification_mailer.rb
135
+ - spec/internal/app/mailers/notification_mailer_no_layout.rb
136
+ - spec/internal/app/views/layouts/notification_mailer.html.erb
137
+ - spec/internal/app/views/layouts/notification_mailer_without_style.html.erb
138
+ - spec/internal/app/views/notification_mailer/email_with_html_only.html.erb
139
+ - spec/internal/app/views/notification_mailer/welcome_html_email.html.erb
140
+ - spec/internal/app/views/notification_mailer/welcome_html_email.text.erb
141
+ - spec/internal/app/views/notification_mailer_no_style/email_with_no_style.html.erb
142
+ - spec/internal/config/database.yml
143
+ - spec/internal/config/routes.rb
144
+ - spec/internal/db/schema.rb
145
+ - spec/internal/log/.gitignore
146
+ - spec/internal/public/favicon.ico
147
+ - spec/lib/action_mailer/inline/css_helper_spec.rb
148
+ - spec/lib/action_mailer/inline/processor_spec.rb
149
+ - spec/lib/action_mailer/inline_spec.rb
150
+ - spec/spec_helper.rb
151
+ homepage: http://github.com/testpilot/actionmailer-instyle
152
+ licenses: []
153
+ post_install_message:
154
+ rdoc_options: []
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ none: false
159
+ requirements:
160
+ - - ! '>='
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ required_rubygems_version: !ruby/object:Gem::Requirement
164
+ none: false
165
+ requirements:
166
+ - - ! '>='
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ requirements: []
170
+ rubyforge_project:
171
+ rubygems_version: 1.8.15
172
+ signing_key:
173
+ specification_version: 3
174
+ summary: This gem brings you the power of the premailer gem to Rails 3 without any
175
+ configuration needs. Create HTML emails, include a CSS file as you do in a normal
176
+ HTML document and premailer will inline the included CSS.
177
+ test_files:
178
+ - spec/internal/app/assets/stylesheets/notification_mailer.css.scss
179
+ - spec/internal/app/mailers/notification_mailer.rb
180
+ - spec/internal/app/mailers/notification_mailer_no_layout.rb
181
+ - spec/internal/app/views/layouts/notification_mailer.html.erb
182
+ - spec/internal/app/views/layouts/notification_mailer_without_style.html.erb
183
+ - spec/internal/app/views/notification_mailer/email_with_html_only.html.erb
184
+ - spec/internal/app/views/notification_mailer/welcome_html_email.html.erb
185
+ - spec/internal/app/views/notification_mailer/welcome_html_email.text.erb
186
+ - spec/internal/app/views/notification_mailer_no_style/email_with_no_style.html.erb
187
+ - spec/internal/config/database.yml
188
+ - spec/internal/config/routes.rb
189
+ - spec/internal/db/schema.rb
190
+ - spec/internal/log/.gitignore
191
+ - spec/internal/public/favicon.ico
192
+ - spec/lib/action_mailer/inline/css_helper_spec.rb
193
+ - spec/lib/action_mailer/inline/processor_spec.rb
194
+ - spec/lib/action_mailer/inline_spec.rb
195
+ - spec/spec_helper.rb