ghost_in_the_post 0.1.3 → 0.1.4
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.
- checksums.yaml +4 -4
- data/lib/ghost_in_the_post.rb +2 -1
- data/lib/ghost_in_the_post/js_inline.rb +4 -1
- data/lib/ghost_in_the_post/js_loaders/asset_pipeline_loader.rb +10 -1
- data/lib/ghost_in_the_post/phantom_transform.rb +0 -2
- data/lib/ghost_in_the_post/version.rb +1 -1
- data/spec/lib/ghost_in_the_post/js_inline_spec.rb +10 -1
- data/spec/lib/ghost_in_the_post/js_loaders/asset_pipeline_loader_spec.rb +35 -0
- data/spec/lib/ghost_in_the_post/js_loaders/network_loader_spec.rb +53 -0
- data/spec/lib/ghost_in_the_post/phantom_transform_spec.rb +1 -0
- data/spec/lib/ghost_in_the_post_spec.rb +8 -0
- metadata +29 -24
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9882b7c81a059e680ca7aaae7e0b8bd2bf23863f
|
|
4
|
+
data.tar.gz: 7e7384c6fb80fee05d43839605778697b9063889
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6b01c14bc2d83a7c82dffdcff158b0d2e6b6199bc02dead5343c40521898dd71a9058be94df6f5b5aad1ccc00827b5a576c0adc160b03c0c45a8e721dacf051c
|
|
7
|
+
data.tar.gz: ec44cfc2541d9c8cc631cc3622827c394a22a6ac2433ce7df430389cd2ebfb26fb748d897e7b50b011c1d1ab9ee7b83c82543f81d8456a27d6cd7099c8586730
|
data/lib/ghost_in_the_post.rb
CHANGED
|
@@ -30,9 +30,10 @@ module GhostInThePost
|
|
|
30
30
|
new_config.each do |key, value|
|
|
31
31
|
self.send("#{key}=", value)
|
|
32
32
|
end
|
|
33
|
-
raise ArgumentError, "
|
|
33
|
+
raise ArgumentError, "phantomjs not found at path `#{@@phantomjs_path}` provided to GhostInThePost" unless File.exist?(phantomjs_path)
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
+
|
|
36
37
|
def self.phantomjs_path
|
|
37
38
|
@@phantomjs_path or raise ArgumentError, "GhostInThePost.config.phantomjs_path is not set"
|
|
38
39
|
end
|
|
@@ -47,7 +47,10 @@ module GhostInThePost
|
|
|
47
47
|
if GhostInThePost.raise_asset_errors and asset.nil?
|
|
48
48
|
raise AssetNotFoundError.new("cannot find asset #{normalize_asset_name(script)}")
|
|
49
49
|
end
|
|
50
|
-
|
|
50
|
+
unless asset.nil?
|
|
51
|
+
GhostInThePost::JSLoaders::CacheLoader.store(script, asset.to_s)
|
|
52
|
+
asset.to_s
|
|
53
|
+
end
|
|
51
54
|
end.compact.join("\n")
|
|
52
55
|
end
|
|
53
56
|
|
|
@@ -16,11 +16,20 @@ module GhostInThePost
|
|
|
16
16
|
::Rails.application.respond_to?(:assets) &&
|
|
17
17
|
::Rails.application.assets
|
|
18
18
|
end
|
|
19
|
+
|
|
20
|
+
DIGEST_PATTERN = /
|
|
21
|
+
- # Digest comes after a dash
|
|
22
|
+
(?:
|
|
23
|
+
[a-z0-9]{32} | # Old style is 32 character hash
|
|
24
|
+
[a-z0-9]{64} # New style is 64 characters
|
|
25
|
+
)
|
|
26
|
+
\. # Dot for the file extension
|
|
27
|
+
/x.freeze
|
|
19
28
|
|
|
20
29
|
def file_name(url)
|
|
21
30
|
URI(url).path
|
|
22
31
|
.sub("#{::Rails.configuration.assets.prefix}/", '')
|
|
23
|
-
.
|
|
32
|
+
.gsub(DIGEST_PATTERN, '.')
|
|
24
33
|
end
|
|
25
34
|
end
|
|
26
35
|
end
|
|
@@ -4,7 +4,6 @@ module GhostInThePost
|
|
|
4
4
|
|
|
5
5
|
class PhantomTransform
|
|
6
6
|
PHANTOMJS_SCRIPT = File.expand_path('../phantom/staticize.js', __FILE__)
|
|
7
|
-
TAG = "[GHOSTINTHEPOST-STATICIZE]"
|
|
8
7
|
ERROR_TAG = "[GHOSTINTHEPOST-STATICIZE-ERROR]"
|
|
9
8
|
|
|
10
9
|
def initialize(html, timeout=nil, wait_event=nil, included_scripts=nil)
|
|
@@ -18,7 +17,6 @@ module GhostInThePost
|
|
|
18
17
|
begin
|
|
19
18
|
htmlfile = html_file(@inliner.html)
|
|
20
19
|
@inliner.html = checkError(IO.popen(command(htmlfile)){|io| io.read})
|
|
21
|
-
p "#{TAG} #{@inliner.html}" if GhostInThePost.debug
|
|
22
20
|
ensure
|
|
23
21
|
if GhostInThePost.debug and @has_error
|
|
24
22
|
p "Generated html can be found at #{htmlfile.path}"
|
|
@@ -10,6 +10,10 @@ module GhostInThePost
|
|
|
10
10
|
let(:included_scripts){["application.js"]}
|
|
11
11
|
subject {JsInline.new(html, included_scripts)}
|
|
12
12
|
|
|
13
|
+
before :each do
|
|
14
|
+
allow(File).to receive(:exist?){true}
|
|
15
|
+
end
|
|
16
|
+
|
|
13
17
|
describe "#initialize" do
|
|
14
18
|
it "should assign html" do
|
|
15
19
|
expect(Nokogiri::HTML).to receive(:parse)
|
|
@@ -27,7 +31,7 @@ module GhostInThePost
|
|
|
27
31
|
|
|
28
32
|
describe "#inline" do
|
|
29
33
|
before :each do
|
|
30
|
-
allow(subject).to receive(:
|
|
34
|
+
allow(subject).to receive(:find_js).with("application.js").and_return(js)
|
|
31
35
|
end
|
|
32
36
|
|
|
33
37
|
it "should inline js" do
|
|
@@ -35,6 +39,11 @@ module GhostInThePost
|
|
|
35
39
|
expect(subject.html).to include(js)
|
|
36
40
|
expect(subject.html).to include("<script id=\"#{JsInline::SCRIPT_ID}\"")
|
|
37
41
|
end
|
|
42
|
+
|
|
43
|
+
it "should cache the script" do
|
|
44
|
+
expect(GhostInThePost::JSLoaders::CacheLoader).to receive(:store).with("application.js", js)
|
|
45
|
+
subject.inline
|
|
46
|
+
end
|
|
38
47
|
end
|
|
39
48
|
|
|
40
49
|
describe "#remove_all_script" do
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe GhostInThePost::JSLoaders::AssetPipelineLoader do
|
|
4
|
+
before do
|
|
5
|
+
assets = double(prefix: '/assets')
|
|
6
|
+
config = double(assets: assets)
|
|
7
|
+
allow(Rails).to receive(:configuration).and_return(config)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
describe "#file_name" do
|
|
11
|
+
subject do
|
|
12
|
+
GhostInThePost::JSLoaders::AssetPipelineLoader.file_name(asset)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
context "when asset file path contains prefix" do
|
|
16
|
+
let(:asset) { '/assets/application.css' }
|
|
17
|
+
it { is_expected.to eq('application.css') }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
context "when asset file path contains 32 chars fingerprint" do
|
|
21
|
+
let(:asset) { 'application-6776f581a4329e299531e1d52aa59832.css' }
|
|
22
|
+
it { is_expected.to eq('application.css') }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
context "when asset file path contains 64 chars fingerprint" do
|
|
26
|
+
let(:asset) { 'application-02275ccb3fd0c11615bbfb11c99ea123ca2287e75045fe7b72cefafb880dad2b.css' }
|
|
27
|
+
it { is_expected.to eq('application.css') }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context "when asset file page contains numbers, but not a fingerprint" do
|
|
31
|
+
let(:asset) { 'test/20130708152545-foo-bar.css' }
|
|
32
|
+
it { is_expected.to eq("test/20130708152545-foo-bar.css") }
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe GhostInThePost::JSLoaders::NetworkLoader do
|
|
4
|
+
describe '#uri_for_url' do
|
|
5
|
+
subject { described_class.uri_for_url(url) }
|
|
6
|
+
let(:asset_host) { nil }
|
|
7
|
+
|
|
8
|
+
before do
|
|
9
|
+
action_controller = double(asset_host: asset_host)
|
|
10
|
+
config = double(action_controller: action_controller)
|
|
11
|
+
allow(Rails).to receive(:configuration).and_return(config)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
context 'with a valid URL' do
|
|
15
|
+
let(:url) { 'http://example.com/test.css' }
|
|
16
|
+
it { is_expected.to eq(URI(url)) }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context 'with a protocol relative URL' do
|
|
20
|
+
let(:url) { '//example.com/test.css' }
|
|
21
|
+
it { is_expected.to eq(URI("http://#{url}")) }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
context 'with a file path' do
|
|
25
|
+
let(:url) { '/assets/foo.css' }
|
|
26
|
+
|
|
27
|
+
context 'and a domain as asset host' do
|
|
28
|
+
let(:asset_host) { 'example.com' }
|
|
29
|
+
it { is_expected.to eq(URI("http://example.com#{url}")) }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context 'and a URL as asset host' do
|
|
33
|
+
let(:asset_host) { 'https://example.com' }
|
|
34
|
+
it { is_expected.to eq(URI("https://example.com/assets/foo.css")) }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context 'and a protocol relative URL as asset host' do
|
|
38
|
+
let(:asset_host) { '//example.com' }
|
|
39
|
+
it { is_expected.to eq(URI("http://example.com/assets/foo.css")) }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
context 'and a proc as asset host' do
|
|
43
|
+
let(:asset_host) { ->{ 'example.com' } }
|
|
44
|
+
it { is_expected.to eq(URI("http://example.com/assets/foo.css")) }
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
context 'without an asset host' do
|
|
48
|
+
let(:asset_host) { nil }
|
|
49
|
+
it { is_expected.not_to be }
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -9,6 +9,7 @@ module GhostInThePost
|
|
|
9
9
|
subject {PhantomTransform.new(html, nil, nil,included_scripts)}
|
|
10
10
|
|
|
11
11
|
before :each do
|
|
12
|
+
allow(File).to receive(:exist?).with("this/is/path"){true}
|
|
12
13
|
GhostInThePost.config = {phantomjs_path: "this/is/path"}
|
|
13
14
|
allow_message_expectations_on_nil
|
|
14
15
|
end
|
|
@@ -5,6 +5,9 @@ describe GhostInThePost do
|
|
|
5
5
|
before :each do
|
|
6
6
|
#reload so that variables are set to initials values
|
|
7
7
|
quiet_load 'ghost_in_the_post.rb'
|
|
8
|
+
allow(File).to receive(:exist?){|path|
|
|
9
|
+
path == "test_path"
|
|
10
|
+
}
|
|
8
11
|
end
|
|
9
12
|
|
|
10
13
|
describe "#create=" do
|
|
@@ -22,6 +25,11 @@ describe GhostInThePost do
|
|
|
22
25
|
GhostInThePost.config = {}
|
|
23
26
|
end.to raise_error(ArgumentError)
|
|
24
27
|
end
|
|
28
|
+
it "should raise ArgumentError if path was set for phantom but it is not at that path" do
|
|
29
|
+
expect do
|
|
30
|
+
GhostInThePost.config = {phantomjs_path: "nope"}
|
|
31
|
+
end.to raise_error(ArgumentError)
|
|
32
|
+
end
|
|
25
33
|
it "should set includes" do
|
|
26
34
|
GhostInThePost.config = {phantomjs_path: "test_path", includes: ["test"]}
|
|
27
35
|
expect(GhostInThePost.includes).to eq(["test"])
|
metadata
CHANGED
|
@@ -1,86 +1,87 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ghost_in_the_post
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Tim Anema
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
date: 2016-03-19 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: rails
|
|
14
15
|
requirement: !ruby/object:Gem::Requirement
|
|
15
16
|
requirements:
|
|
16
17
|
- - "~>"
|
|
17
18
|
- !ruby/object:Gem::Version
|
|
18
19
|
version: 4.2.3
|
|
19
|
-
name: rails
|
|
20
|
-
prerelease: false
|
|
21
20
|
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
26
|
version: 4.2.3
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: nokogiri
|
|
28
29
|
requirement: !ruby/object:Gem::Requirement
|
|
29
30
|
requirements:
|
|
30
31
|
- - ">="
|
|
31
32
|
- !ruby/object:Gem::Version
|
|
32
33
|
version: '0'
|
|
33
|
-
name: nokogiri
|
|
34
|
-
prerelease: false
|
|
35
34
|
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - ">="
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '0'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: bundler
|
|
42
43
|
requirement: !ruby/object:Gem::Requirement
|
|
43
44
|
requirements:
|
|
44
45
|
- - "~>"
|
|
45
46
|
- !ruby/object:Gem::Version
|
|
46
47
|
version: '1.6'
|
|
47
|
-
name: bundler
|
|
48
|
-
prerelease: false
|
|
49
48
|
type: :development
|
|
49
|
+
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
54
|
version: '1.6'
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: rspec
|
|
56
57
|
requirement: !ruby/object:Gem::Requirement
|
|
57
58
|
requirements:
|
|
58
59
|
- - "~>"
|
|
59
60
|
- !ruby/object:Gem::Version
|
|
60
61
|
version: '3.0'
|
|
61
|
-
name: rspec
|
|
62
|
-
prerelease: false
|
|
63
62
|
type: :development
|
|
63
|
+
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements:
|
|
66
66
|
- - "~>"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
68
|
version: '3.0'
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: rspec-rails
|
|
70
71
|
requirement: !ruby/object:Gem::Requirement
|
|
71
72
|
requirements:
|
|
72
73
|
- - ">="
|
|
73
74
|
- !ruby/object:Gem::Version
|
|
74
75
|
version: '0'
|
|
75
|
-
name: rspec-rails
|
|
76
|
-
prerelease: false
|
|
77
76
|
type: :development
|
|
77
|
+
prerelease: false
|
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
79
|
requirements:
|
|
80
80
|
- - ">="
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
82
|
version: '0'
|
|
83
|
-
description: Using phantomjs to pre-run javascript in emails. This is best if you
|
|
83
|
+
description: Using phantomjs to pre-run javascript in emails. This is best if you
|
|
84
|
+
have content that uses mustache templates that you would like to reuse in your emails.
|
|
84
85
|
email:
|
|
85
86
|
- timanema@gmail.com
|
|
86
87
|
executables: []
|
|
@@ -138,6 +139,8 @@ files:
|
|
|
138
139
|
- spec/lib/ghost_in_the_post/automatic_spec.rb
|
|
139
140
|
- spec/lib/ghost_in_the_post/ghost_on_command_spec.rb
|
|
140
141
|
- spec/lib/ghost_in_the_post/js_inline_spec.rb
|
|
142
|
+
- spec/lib/ghost_in_the_post/js_loaders/asset_pipeline_loader_spec.rb
|
|
143
|
+
- spec/lib/ghost_in_the_post/js_loaders/network_loader_spec.rb
|
|
141
144
|
- spec/lib/ghost_in_the_post/mail_ghost_spec.rb
|
|
142
145
|
- spec/lib/ghost_in_the_post/mailer_spec.rb
|
|
143
146
|
- spec/lib/ghost_in_the_post/phantom_transform_spec.rb
|
|
@@ -149,7 +152,7 @@ homepage: https://github.com/tanema/ghost_in_the_post
|
|
|
149
152
|
licenses:
|
|
150
153
|
- MIT
|
|
151
154
|
metadata: {}
|
|
152
|
-
post_install_message:
|
|
155
|
+
post_install_message:
|
|
153
156
|
rdoc_options: []
|
|
154
157
|
require_paths:
|
|
155
158
|
- lib
|
|
@@ -164,16 +167,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
164
167
|
- !ruby/object:Gem::Version
|
|
165
168
|
version: '0'
|
|
166
169
|
requirements: []
|
|
167
|
-
rubyforge_project:
|
|
168
|
-
rubygems_version: 2.
|
|
169
|
-
signing_key:
|
|
170
|
+
rubyforge_project:
|
|
171
|
+
rubygems_version: 2.2.2
|
|
172
|
+
signing_key:
|
|
170
173
|
specification_version: 4
|
|
171
174
|
summary: Using phantomjs to pre-run javascript in emails
|
|
172
175
|
test_files:
|
|
173
|
-
- spec/spec_helper.rb
|
|
174
|
-
- spec/dummy/config.ru
|
|
175
|
-
- spec/dummy/Gemfile
|
|
176
|
-
- spec/dummy/Gemfile.lock
|
|
177
176
|
- spec/dummy/app/assets/javascripts/application.js
|
|
178
177
|
- spec/dummy/app/assets/javascripts/test.js
|
|
179
178
|
- spec/dummy/app/mailers/mailer.rb
|
|
@@ -188,8 +187,6 @@ test_files:
|
|
|
188
187
|
- spec/dummy/config/application.rb
|
|
189
188
|
- spec/dummy/config/boot.rb
|
|
190
189
|
- spec/dummy/config/environment.rb
|
|
191
|
-
- spec/dummy/config/routes.rb
|
|
192
|
-
- spec/dummy/config/secrets.yml
|
|
193
190
|
- spec/dummy/config/environments/development.rb
|
|
194
191
|
- spec/dummy/config/initializers/assets.rb
|
|
195
192
|
- spec/dummy/config/initializers/backtrace_silencers.rb
|
|
@@ -200,12 +197,20 @@ test_files:
|
|
|
200
197
|
- spec/dummy/config/initializers/mime_types.rb
|
|
201
198
|
- spec/dummy/config/initializers/session_store.rb
|
|
202
199
|
- spec/dummy/config/initializers/wrap_parameters.rb
|
|
203
|
-
- spec/
|
|
200
|
+
- spec/dummy/config/routes.rb
|
|
201
|
+
- spec/dummy/config/secrets.yml
|
|
202
|
+
- spec/dummy/config.ru
|
|
203
|
+
- spec/dummy/Gemfile
|
|
204
|
+
- spec/dummy/Gemfile.lock
|
|
204
205
|
- spec/lib/ghost_in_the_post/automatic_spec.rb
|
|
205
206
|
- spec/lib/ghost_in_the_post/ghost_on_command_spec.rb
|
|
206
207
|
- spec/lib/ghost_in_the_post/js_inline_spec.rb
|
|
208
|
+
- spec/lib/ghost_in_the_post/js_loaders/asset_pipeline_loader_spec.rb
|
|
209
|
+
- spec/lib/ghost_in_the_post/js_loaders/network_loader_spec.rb
|
|
207
210
|
- spec/lib/ghost_in_the_post/mail_ghost_spec.rb
|
|
208
211
|
- spec/lib/ghost_in_the_post/mailer_spec.rb
|
|
209
212
|
- spec/lib/ghost_in_the_post/phantom_transform_spec.rb
|
|
213
|
+
- spec/lib/ghost_in_the_post_spec.rb
|
|
214
|
+
- spec/spec_helper.rb
|
|
210
215
|
- spec/support/mailer_support.rb
|
|
211
216
|
- spec/support/quiet_load.rb
|