premailer-rails3 0.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  *.gem
2
2
  doc/
3
+ Gemfile.lock
data/Rakefile CHANGED
@@ -1,2 +1,7 @@
1
1
  require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :default => :spec
@@ -1,5 +1,5 @@
1
1
  require 'premailer'
2
- require 'hpricot'
2
+ require 'premailer-rails3/css_helper'
3
3
  require 'premailer-rails3/premailer'
4
4
  require 'premailer-rails3/hook'
5
5
 
@@ -0,0 +1,56 @@
1
+ module PremailerRails
2
+ module CSSHelper
3
+ extend self
4
+
5
+ @@css_cache = {}
6
+
7
+ def css_for_doc(doc)
8
+ css = doc.search('link[@type="text/css"]').map { |link|
9
+ url = link.attributes['href']
10
+ load_css_at_path(url) unless url.blank?
11
+ }.reject(&:blank?).join("\n")
12
+ css = load_css_at_path(:default) if css.blank?
13
+ css
14
+ end
15
+
16
+ private
17
+
18
+ def load_css_at_path(path)
19
+ if path.is_a? String
20
+ # Remove everything after ? including ?
21
+ path = path[0..(path.index('?') - 1)] if path.include? '?'
22
+ # Remove the host
23
+ path = path.gsub(/^https?\:\/\/[^\/]*/, '') if path.index('http') == 0
24
+ end
25
+
26
+ # Don't cache in development.
27
+ if Rails.env.development? or not @@css_cache.include? path
28
+ @@css_cache[path] =
29
+ if defined? Hassle and Rails.configuration.middleware.include? Hassle
30
+ file = path == :default ? '/stylesheets/email.css' : path
31
+ File.read("#{Rails.root}/tmp/hassle#{file}")
32
+ elsif Rails.configuration.try(:assets).try(:enabled)
33
+ file = if path == :default
34
+ 'email.css'
35
+ else
36
+ path.sub("#{Rails.configuration.assets.prefix}/", '')
37
+ end
38
+ if asset = Rails.application.assets.find_asset(file)
39
+ asset.body
40
+ else
41
+ raise "Couldn't find asset #{file} for premailer-rails3."
42
+ end
43
+ else
44
+ file = path == :default ? '/stylesheets/email.css' : path
45
+ File.read("#{Rails.root}/public#{file}")
46
+ end
47
+ end
48
+
49
+ @@css_cache[path]
50
+ rescue => ex
51
+ # Print an error and store empty string as the CSS.
52
+ puts ex.message
53
+ @@css_cache[path] = ''
54
+ end
55
+ end
56
+ end
@@ -1,18 +1,32 @@
1
1
  module PremailerRails
2
2
  class Hook
3
3
  def self.delivering_email(message)
4
- premailer = Premailer.new(message.body.to_s)
4
+ # If the mail only has one part, it may be stored in message.body. In that
5
+ # case, if the mail content type is text/html, the body part will be the
6
+ # html body.
7
+ if message.html_part
8
+ html_body = message.html_part.body.to_s
9
+ elsif message.content_type =~ /text\/html/
10
+ html_body = message.body.to_s
11
+ message.body = nil
12
+ end
5
13
 
6
- # reset the body and add two new bodies with appropriate types
7
- message.body = nil
14
+ if html_body
15
+ premailer = Premailer.new(html_body)
16
+ charset = message.charset
8
17
 
9
- message.html_part do
10
- content_type "text/html; charset=utf-8"
11
- body premailer.to_inline_css
12
- end
18
+ # IMPRTANT: Plain text part must be generated before CSS is inlined.
19
+ # Not doing so results in CSS declarations visible in the plain text
20
+ # part.
21
+ message.text_part do
22
+ content_type "text/plain; charset=#{charset}"
23
+ body premailer.to_plain_text
24
+ end unless message.text_part
13
25
 
14
- message.text_part do
15
- body premailer.to_plain_text
26
+ message.html_part do
27
+ content_type "text/html; charset=#{charset}"
28
+ body premailer.to_inline_css
29
+ end
16
30
  end
17
31
  end
18
32
  end
@@ -1,19 +1,21 @@
1
1
  module PremailerRails
2
2
  class Premailer < ::Premailer
3
3
  def initialize(html)
4
- if defined? Hassle and Rails.configuration.middleware.include? Hassle
5
- css_file = 'tmp/hassle/stylesheets/email.css'
6
- else
7
- css_file = 'public/stylesheets/email.css'
8
- end
4
+ # In order to pass the CSS as string to super it is necessary to access
5
+ # the parsed HTML beforehand. To do so, the adapter needs to be
6
+ # initialized. The ::Premailer::Adaptor handles the discovery of a
7
+ # suitable adaptor (Nokogiri or Hpricot). To make load_html work, an
8
+ # adaptor needs to be included and @options[:with_html_string] needs to be
9
+ # set. For further information, refer to ::Premailer#initialize.
10
+ @options = { :with_html_string => true }
11
+ ::Premailer.send(:include, Adapter.find(Adapter.use))
12
+ doc = load_html(html)
9
13
 
10
- super(html, :with_html_string => true,
11
- :adapter => :hpricot,
12
- :css => [css_file])
13
- end
14
-
15
- def load_html(string)
16
- Hpricot(string)
14
+ options = {
15
+ :with_html_string => true,
16
+ :css_string => CSSHelper.css_for_doc(doc)
17
+ }
18
+ super(html, options)
17
19
  end
18
20
  end
19
21
  end
@@ -1,3 +1,3 @@
1
1
  module PremailerRails
2
- VERSION = "0.2"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -23,5 +23,12 @@ Gem::Specification.new do |s|
23
23
  s.require_paths = ["lib"]
24
24
 
25
25
  s.add_dependency("premailer", ["~> 1.7"])
26
- s.add_dependency("hpricot", ["~> 0.8"])
26
+ s.add_dependency("rails", ["~> 3"])
27
+
28
+ s.add_development_dependency 'rspec-core'
29
+ s.add_development_dependency 'rspec-expectations'
30
+ s.add_development_dependency 'mocha'
31
+ s.add_development_dependency 'mail'
32
+ s.add_development_dependency 'nokogiri'
33
+ s.add_development_dependency 'hpricot'
27
34
  end
@@ -0,0 +1,38 @@
1
+ module Fixtures
2
+ module HTML
3
+ extend self
4
+
5
+ TEMPLATE = <<-HTML
6
+ <html>
7
+ <head>
8
+ %s
9
+ </head>
10
+ <body>
11
+ <p>
12
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
13
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
14
+ veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
15
+ commodo consequat.
16
+ </p>
17
+ </body>
18
+ </html>
19
+ HTML
20
+
21
+ LINK = <<-LINK
22
+ <link rel='stylesheet' type='text/css' href='%s' />
23
+ LINK
24
+
25
+ def with_css_links(*files)
26
+ links = []
27
+ files.each do |file|
28
+ links << LINK % "http://example.com/#{file}"
29
+ end
30
+
31
+ TEMPLATE % links.join("\n")
32
+ end
33
+
34
+ def with_no_css_link
35
+ with_css_links
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,68 @@
1
+ require 'mail'
2
+
3
+ module Fixtures
4
+ module Message
5
+ extend self
6
+
7
+ HTML_PART = <<-HTML
8
+ <html>
9
+ <head>
10
+ </head>
11
+ <body>
12
+ <p>
13
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
14
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
15
+ veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
16
+ commodo consequat.
17
+ </p>
18
+ </body>
19
+ </html>
20
+ HTML
21
+
22
+ TEXT_PART = <<-TEXT
23
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
24
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
25
+ nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
26
+ TEXT
27
+
28
+ def with_parts(*part_types)
29
+ message = base_message
30
+
31
+ message.html_part do
32
+ body HTML_PART
33
+ content_type 'text/html; charset=UTF-8'
34
+ end if part_types.include? :html
35
+
36
+ message.text_part do
37
+ body TEXT_PART
38
+ content_type 'text/plain; charset=UTF-8'
39
+ end if part_types.include? :text
40
+
41
+ message
42
+ end
43
+
44
+ def with_body(body_type)
45
+ message = base_message
46
+
47
+ case body_type
48
+ when :html
49
+ message.body = HTML_PART
50
+ message.content_type 'text/html; charset=UTF-8'
51
+ when :text
52
+ message.body = TEXT_PART
53
+ message.content_type 'text/plain; charset=UTF-8'
54
+ end
55
+
56
+ message
57
+ end
58
+
59
+ private
60
+
61
+ def base_message
62
+ Mail.new do
63
+ to 'some@email.com'
64
+ subject 'testing premailer-rails3'
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,146 @@
1
+ require 'spec_helper'
2
+
3
+ describe PremailerRails::CSSHelper do
4
+ # Reset the CSS cache
5
+ after { PremailerRails::CSSHelper.send(:class_variable_set, '@@css_cache', {}) }
6
+
7
+ def load_css_at_path(path)
8
+ PremailerRails::CSSHelper.send(:load_css_at_path, path)
9
+ end
10
+
11
+ def css_for_doc(doc)
12
+ PremailerRails::CSSHelper.css_for_doc(doc)
13
+ end
14
+
15
+ describe '#css_for_doc' do
16
+ let(:html) { Fixtures::HTML.with_css_links(*files) }
17
+ let(:doc) { Hpricot(html) }
18
+
19
+ context 'when HTML contains linked CSS files' do
20
+ let(:files) { %w[ stylesheets/base.css stylesheets/font.css ] }
21
+
22
+ it 'should return the content of both files concatenated' do
23
+ PremailerRails::CSSHelper \
24
+ .expects(:load_css_at_path) \
25
+ .with('http://example.com/stylesheets/base.css') \
26
+ .returns('content of base.css')
27
+ PremailerRails::CSSHelper \
28
+ .expects(:load_css_at_path) \
29
+ .with('http://example.com/stylesheets/font.css') \
30
+ .returns('content of font.css')
31
+
32
+ css_for_doc(doc).should == "content of base.css\ncontent of font.css"
33
+ end
34
+ end
35
+
36
+ context 'when HTML contains no linked CSS file' do
37
+ let(:files) { [] }
38
+
39
+ it 'should return the content of the default file' do
40
+ PremailerRails::CSSHelper \
41
+ .expects(:load_css_at_path) \
42
+ .with(:default) \
43
+ .returns('content of default css file')
44
+
45
+ css_for_doc(doc).should == 'content of default css file'
46
+ end
47
+ end
48
+ end
49
+
50
+ describe '#load_css_at_path' do
51
+ context 'when path is a url' do
52
+ it 'should load the CSS at the local path' do
53
+ File.expects(:read).with('RAILS_ROOT/public/stylesheets/base.css')
54
+
55
+ load_css_at_path('http://example.com/stylesheets/base.css?test')
56
+ end
57
+ end
58
+
59
+ context 'when file is cached' do
60
+ it 'should return the cached value' do
61
+ cache = PremailerRails::CSSHelper.send(:class_variable_get, '@@css_cache')
62
+ cache['/stylesheets/base.css'] = 'content of base.css'
63
+
64
+ load_css_at_path('http://example.com/stylesheets/base.css') \
65
+ .should == 'content of base.css'
66
+ end
67
+ end
68
+
69
+ context 'when in development mode' do
70
+ it 'should not return cached values' do
71
+ cache = PremailerRails::CSSHelper.send(:class_variable_get, '@@css_cache')
72
+ cache['/stylesheets/base.css'] = 'cached content of base.css'
73
+ File.expects(:read) \
74
+ .with('RAILS_ROOT/public/stylesheets/base.css') \
75
+ .returns('new content of base.css')
76
+ Rails.env.stubs(:development?).returns(true)
77
+
78
+ load_css_at_path('http://example.com/stylesheets/base.css') \
79
+ .should == 'new content of base.css'
80
+ end
81
+ end
82
+
83
+ context 'when Hassle is used' do
84
+ before { Rails.configuration.middleware.stubs(:include?) \
85
+ .with(Hassle) \
86
+ .returns(true) }
87
+
88
+ it 'should load email.css when the default CSS is requested' do
89
+ File.expects(:read) \
90
+ .with('RAILS_ROOT/tmp/hassle/stylesheets/email.css') \
91
+ .returns('content of default css')
92
+
93
+ load_css_at_path(:default).should == 'content of default css'
94
+ end
95
+
96
+ it 'should return the content of the file compiled by Hassle' do
97
+ File.expects(:read) \
98
+ .with('RAILS_ROOT/tmp/hassle/stylesheets/base.css') \
99
+ .returns('content of base.css')
100
+
101
+ load_css_at_path('http://example.com/stylesheets/base.css') \
102
+ .should == 'content of base.css'
103
+ end
104
+ end
105
+
106
+ context 'when Rails asset pipeline is used' do
107
+ before { Rails.configuration.assets.stubs(:enabled).returns(true) }
108
+
109
+ it 'should load email.css when the default CSS is requested' do
110
+ Rails.application.assets.expects(:find_asset) \
111
+ .with('email.css') \
112
+ .returns(mock(:body => 'content of default css'))
113
+
114
+ load_css_at_path(:default).should == 'content of default css'
115
+ end
116
+
117
+ it 'should return the content of the file compiled by Rails' do
118
+ Rails.application.assets.expects(:find_asset) \
119
+ .with('base.css') \
120
+ .returns(mock(:body => 'content of base.css'))
121
+
122
+ load_css_at_path('http://example.com/assets/base.css') \
123
+ .should == 'content of base.css'
124
+ end
125
+ end
126
+
127
+ context 'when static stylesheets are used' do
128
+ it 'should load email.css when the default CSS is requested' do
129
+ File.expects(:read) \
130
+ .with('RAILS_ROOT/public/stylesheets/email.css') \
131
+ .returns('content of default css')
132
+
133
+ load_css_at_path(:default).should == 'content of default css'
134
+ end
135
+
136
+ it 'should return the content of the static file' do
137
+ File.expects(:read) \
138
+ .with('RAILS_ROOT/public/stylesheets/base.css') \
139
+ .returns('content of base.css')
140
+
141
+ load_css_at_path('http://example.com/stylesheets/base.css') \
142
+ .should == 'content of base.css'
143
+ end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'ActionMailer::Base.register_interceptor' do
4
+ it 'should register interceptor PremailerRails::Hook' do
5
+ ActionMailer::Base \
6
+ .expects(:register_interceptor) \
7
+ .with(PremailerRails::Hook)
8
+ load 'premailer-rails3.rb'
9
+ end
10
+ end
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+
3
+ describe PremailerRails::Hook do
4
+ describe '.delivering_email' do
5
+ before { File.stubs(:read).returns('') }
6
+ def run_hook(message)
7
+ PremailerRails::Hook.delivering_email(message)
8
+ end
9
+
10
+ context 'when message contains html part' do
11
+ let(:message) { Fixtures::Message.with_parts :html }
12
+
13
+ it 'should create a text part from the html part' do
14
+ PremailerRails::Premailer.any_instance.expects(:to_plain_text)
15
+ run_hook(message)
16
+ message.text_part.should be_a Mail::Part
17
+ end
18
+
19
+ it 'should inline the css in the html part' do
20
+ PremailerRails::Premailer.any_instance.expects(:to_inline_css)
21
+ run_hook(message)
22
+ end
23
+ end
24
+
25
+ context 'when message contains text part' do
26
+ let(:message) { Fixtures::Message.with_parts :text }
27
+
28
+ it 'should not modify the message' do
29
+ Premailer.expects(:new).never
30
+ run_hook(message)
31
+ end
32
+ end
33
+
34
+ context 'when message contains html and text part' do
35
+ let(:message) { Fixtures::Message.with_parts :html, :text }
36
+
37
+ it 'should not create a text part from the html part' do
38
+ PremailerRails::Premailer.any_instance.expects(:to_plain_text).never
39
+ run_hook(message)
40
+ message.text_part.should be_a Mail::Part
41
+ end
42
+
43
+ it 'should inline the css in the html part' do
44
+ PremailerRails::Premailer.any_instance.expects(:to_inline_css)
45
+ run_hook(message)
46
+ end
47
+ end
48
+
49
+ context 'when message contains html body' do
50
+ let(:message) { Fixtures::Message.with_body :html }
51
+
52
+ it 'should create a text part from the html part' do
53
+ PremailerRails::Premailer.any_instance.expects(:to_plain_text)
54
+ run_hook(message)
55
+ end
56
+
57
+ it 'should create a html part and inline the css' do
58
+ PremailerRails::Premailer.any_instance.expects(:to_inline_css)
59
+ run_hook(message)
60
+ message.html_part.should be_a Mail::Part
61
+ end
62
+ end
63
+
64
+ context 'when message contains text body' do
65
+ let(:message) { Fixtures::Message.with_body :text }
66
+
67
+ it 'should not modify the message' do
68
+ Premailer.expects(:new).never
69
+ run_hook(message)
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,35 @@
1
+ # coding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe PremailerRails::Premailer do
6
+ [ :nokogiri, :hpricot ].each do |adapter|
7
+ context "when adapter is #{adapter}" do
8
+ before { ::Premailer::Adapter.stubs(:use).returns(adapter) }
9
+
10
+ describe '#to_plain_text' do
11
+ it 'should include the text from the HTML part' do
12
+ premailer = PremailerRails::Premailer.new(Fixtures::Message::HTML_PART)
13
+ premailer.to_plain_text.gsub(/\s/, ' ').strip \
14
+ .should == Fixtures::Message::TEXT_PART.gsub(/\s/, ' ').strip
15
+ end
16
+ end
17
+
18
+ describe '#to_inline_css' do
19
+ it 'should return the HTML with the CSS inlined' do
20
+ PremailerRails::CSSHelper.stubs(:css_for_doc).returns('p { color: red; }')
21
+ html = Fixtures::Message::HTML_PART
22
+ premailer = PremailerRails::Premailer.new(html)
23
+ premailer.to_inline_css.should include '<p style="color: red;">'
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ describe '.new' do
30
+ it 'should extract the CSS' do
31
+ PremailerRails::CSSHelper.expects(:css_for_doc)
32
+ PremailerRails::Premailer.new('some html')
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,15 @@
1
+ require 'stubs/action_mailer'
2
+ require 'stubs/rails'
3
+ require 'stubs/try'
4
+ require 'stubs/hassle'
5
+ require 'fixtures/message'
6
+ require 'fixtures/html'
7
+
8
+ require 'hpricot'
9
+ require 'nokogiri'
10
+
11
+ require 'premailer-rails3'
12
+
13
+ RSpec.configure do |config|
14
+ config.mock_with :mocha
15
+ end
@@ -0,0 +1,5 @@
1
+ module ActionMailer
2
+ module Base
3
+ def self.register_interceptor(x); end
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Dummy
2
+ def method_missing(m, *args)
3
+ self.class.new
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ module Hassle; end
@@ -0,0 +1,63 @@
1
+ require 'stubs/dummy'
2
+
3
+ module Rails
4
+ extend self
5
+
6
+ module Configuration
7
+ extend self
8
+
9
+ module Middleware
10
+ extend self
11
+
12
+ def include?(what)
13
+ false
14
+ end
15
+ end
16
+
17
+ module Assets
18
+ extend self
19
+
20
+ def prefix
21
+ '/assets'
22
+ end
23
+ end
24
+
25
+ def middleware
26
+ Middleware
27
+ end
28
+
29
+ def assets
30
+ Assets
31
+ end
32
+ end
33
+
34
+ module Env
35
+ extend self
36
+
37
+ def development?
38
+ false
39
+ end
40
+ end
41
+
42
+ module Application
43
+ extend self
44
+
45
+ def assets; end
46
+ end
47
+
48
+ def env
49
+ Env
50
+ end
51
+
52
+ def configuration
53
+ Configuration
54
+ end
55
+
56
+ def root
57
+ 'RAILS_ROOT'
58
+ end
59
+
60
+ def application
61
+ Application
62
+ end
63
+ end
data/spec/stubs/try.rb ADDED
@@ -0,0 +1,5 @@
1
+ class Object
2
+ def try(method, *args)
3
+ self.__send__(method, *args) rescue nil
4
+ end
5
+ end
metadata CHANGED
@@ -1,90 +1,170 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: premailer-rails3
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
4
5
  prerelease:
5
- version: "0.2"
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Philipe Fatio
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-06-09 00:00:00 +02:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
12
+ date: 2011-09-29 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
17
15
  name: premailer
18
- prerelease: false
19
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &2157702240 !ruby/object:Gem::Requirement
20
17
  none: false
21
- requirements:
18
+ requirements:
22
19
  - - ~>
23
- - !ruby/object:Gem::Version
24
- version: "1.7"
20
+ - !ruby/object:Gem::Version
21
+ version: '1.7'
25
22
  type: :runtime
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
28
- name: hpricot
29
23
  prerelease: false
30
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *2157702240
25
+ - !ruby/object:Gem::Dependency
26
+ name: rails
27
+ requirement: &2157701400 !ruby/object:Gem::Requirement
31
28
  none: false
32
- requirements:
29
+ requirements:
33
30
  - - ~>
34
- - !ruby/object:Gem::Version
35
- version: "0.8"
31
+ - !ruby/object:Gem::Version
32
+ version: '3'
36
33
  type: :runtime
37
- version_requirements: *id002
38
- description: |-
39
- This gem brings you the power of the premailer gem to Rails 3
40
- without any configuration needs. Create HTML emails, include a
41
- CSS file as you do in a normal HTML document and premailer will
42
- inline the included CSS.
43
- email:
34
+ prerelease: false
35
+ version_requirements: *2157701400
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec-core
38
+ requirement: &2157700700 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2157700700
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec-expectations
49
+ requirement: &2157699900 !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: *2157699900
58
+ - !ruby/object:Gem::Dependency
59
+ name: mocha
60
+ requirement: &2157699220 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *2157699220
69
+ - !ruby/object:Gem::Dependency
70
+ name: mail
71
+ requirement: &2157679360 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *2157679360
80
+ - !ruby/object:Gem::Dependency
81
+ name: nokogiri
82
+ requirement: &2157678940 !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: *2157678940
91
+ - !ruby/object:Gem::Dependency
92
+ name: hpricot
93
+ requirement: &2157678160 !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: *2157678160
102
+ description: ! "This gem brings you the power of the premailer gem to Rails 3\n without
103
+ any configuration needs. Create HTML emails, include a\n CSS
104
+ file as you do in a normal HTML document and premailer will\n inline
105
+ the included CSS."
106
+ email:
44
107
  - philipe.fatio@gmail.com
45
108
  executables: []
46
-
47
109
  extensions: []
48
-
49
110
  extra_rdoc_files: []
50
-
51
- files:
111
+ files:
52
112
  - .gitignore
53
113
  - Gemfile
54
114
  - README.md
55
115
  - Rakefile
56
116
  - lib/premailer-rails3.rb
117
+ - lib/premailer-rails3/css_helper.rb
57
118
  - lib/premailer-rails3/hook.rb
58
119
  - lib/premailer-rails3/premailer.rb
59
120
  - lib/premailer-rails3/version.rb
60
121
  - premailer-rails3.gemspec
61
- has_rdoc: true
122
+ - spec/fixtures/html.rb
123
+ - spec/fixtures/message.rb
124
+ - spec/premailer-rails3/css_helper_spec.rb
125
+ - spec/premailer-rails3/hook_registration_spec.rb
126
+ - spec/premailer-rails3/hook_spec.rb
127
+ - spec/premailer-rails3/premailer_spec.rb
128
+ - spec/spec_helper.rb
129
+ - spec/stubs/action_mailer.rb
130
+ - spec/stubs/dummy.rb
131
+ - spec/stubs/hassle.rb
132
+ - spec/stubs/rails.rb
133
+ - spec/stubs/try.rb
62
134
  homepage: https://github.com/fphilipe/premailer-rails3
63
135
  licenses: []
64
-
65
136
  post_install_message:
66
137
  rdoc_options: []
67
-
68
- require_paths:
138
+ require_paths:
69
139
  - lib
70
- required_ruby_version: !ruby/object:Gem::Requirement
140
+ required_ruby_version: !ruby/object:Gem::Requirement
71
141
  none: false
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: "0"
76
- required_rubygems_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ! '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
147
  none: false
78
- requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- version: "0"
148
+ requirements:
149
+ - - ! '>='
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
82
152
  requirements: []
83
-
84
153
  rubyforge_project: premailer-rails3
85
- rubygems_version: 1.6.2
154
+ rubygems_version: 1.8.8
86
155
  signing_key:
87
156
  specification_version: 3
88
157
  summary: Easily create HTML emails in Rails 3.
89
- test_files: []
90
-
158
+ test_files:
159
+ - spec/fixtures/html.rb
160
+ - spec/fixtures/message.rb
161
+ - spec/premailer-rails3/css_helper_spec.rb
162
+ - spec/premailer-rails3/hook_registration_spec.rb
163
+ - spec/premailer-rails3/hook_spec.rb
164
+ - spec/premailer-rails3/premailer_spec.rb
165
+ - spec/spec_helper.rb
166
+ - spec/stubs/action_mailer.rb
167
+ - spec/stubs/dummy.rb
168
+ - spec/stubs/hassle.rb
169
+ - spec/stubs/rails.rb
170
+ - spec/stubs/try.rb