middleman-cdn 0.1.10 → 0.1.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/middleman-cdn/cdns/cloudflare.rb +24 -13
- data/lib/middleman-cdn/cdns/cloudfront.rb +4 -4
- data/lib/middleman-cdn/cdns/fastly.rb +5 -5
- data/lib/middleman-cdn/cdns/maxcdn.rb +4 -4
- data/lib/middleman-cdn/cdns/rackspace.rb +4 -4
- data/lib/middleman-cdn/commands.rb +11 -5
- data/lib/middleman-cdn/version.rb +1 -1
- data/middleman-cdn.gemspec +1 -1
- data/spec/lib/middleman-cdn/cdns/cloudflare_spec.rb +16 -0
- data/spec/lib/middleman-cdn/commands_spec.rb +7 -7
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4aa1ea493606bab17daddd55eafc4a092b3e36ae
|
4
|
+
data.tar.gz: c1bd19c00e6049f9c0061be48fceb9837d1b91e7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe34df0d332ba27dabd93aa024cc83d7fa62e3b1ed07384266b4c88c29f4d561ce72d2580b57da4bd08d79469c0a6b2a20ce577cafc345954ab2372a43c51928
|
7
|
+
data.tar.gz: 4855e0686dc2541e467ac27484e6f19daac2a4b3f3c24ef8d57c6a156160190226bfe2203f8261a59faa08b28a77177d802b14c0478c99013c5e97e925f9e205
|
@@ -19,34 +19,45 @@ module Middleman
|
|
19
19
|
}
|
20
20
|
end
|
21
21
|
|
22
|
-
def invalidate(options, files)
|
22
|
+
def invalidate(options, files, all: false)
|
23
23
|
options[:client_api_key] ||= ENV['CLOUDFLARE_CLIENT_API_KEY']
|
24
24
|
options[:email] ||= ENV['CLOUDFLARE_EMAIL']
|
25
25
|
|
26
26
|
[:client_api_key, :email, :zone, :base_urls].each do |key|
|
27
27
|
if options[key].blank?
|
28
|
-
say_status("Error: Configuration key cloudflare[:#{key}] is missing.".
|
28
|
+
say_status("Error: Configuration key cloudflare[:#{key}] is missing.".red)
|
29
29
|
raise
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
33
|
options[:base_urls] = [options[:base_urls]] if options[:base_urls].is_a?(String)
|
34
34
|
if !options[:base_urls].is_a?(Array)
|
35
|
-
say_status("Error: Configuration key cloudflare[:base_urls] must be an array and contain at least one base url.".
|
35
|
+
say_status("Error: Configuration key cloudflare[:base_urls] must be an array and contain at least one base url.".red)
|
36
36
|
raise
|
37
37
|
end
|
38
38
|
|
39
39
|
cloudflare = ::CloudFlare::connection(options[:client_api_key], options[:email])
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
40
|
+
if all
|
41
|
+
begin
|
42
|
+
say_status("Invalidating zone #{options[:zone]}... ", newline: false)
|
43
|
+
cloudflare.fpurge_ts(options[:zone])
|
44
|
+
rescue => e
|
45
|
+
say_status(", " + "error: #{e.message}".red, header: false)
|
46
|
+
else
|
47
|
+
say_status("✔".green, header: false)
|
48
|
+
end
|
49
|
+
else
|
50
|
+
options[:base_urls].each do |base_url|
|
51
|
+
files.each do |file|
|
52
|
+
begin
|
53
|
+
url = "#{base_url}#{file}"
|
54
|
+
say_status("Invalidating #{url}... ", newline: false)
|
55
|
+
cloudflare.zone_file_purge(options[:zone], "#{base_url}#{file}")
|
56
|
+
rescue => e
|
57
|
+
say_status(", " + "error: #{e.message}".red, header: false)
|
58
|
+
else
|
59
|
+
say_status("✔".green, header: false)
|
60
|
+
end
|
50
61
|
end
|
51
62
|
end
|
52
63
|
end
|
@@ -19,12 +19,12 @@ module Middleman
|
|
19
19
|
}
|
20
20
|
end
|
21
21
|
|
22
|
-
def invalidate(options, files)
|
22
|
+
def invalidate(options, files, all: false)
|
23
23
|
options[:access_key_id] ||= ENV['AWS_ACCESS_KEY_ID']
|
24
24
|
options[:secret_access_key] ||= ENV['AWS_SECRET_ACCESS_KEY']
|
25
25
|
[:access_key_id, :secret_access_key, :distribution_id].each do |key|
|
26
26
|
if options[key].blank?
|
27
|
-
say_status("Error: Configuration key cloudfront[:base_urls] is missing.".
|
27
|
+
say_status("Error: Configuration key cloudfront[:base_urls] is missing.".red)
|
28
28
|
raise
|
29
29
|
end
|
30
30
|
end
|
@@ -44,7 +44,7 @@ module Middleman
|
|
44
44
|
say_status("Invalidation status is #{invalidation.status}. Expected 'InProgress'.".red.bold, header: false)
|
45
45
|
raise
|
46
46
|
end
|
47
|
-
say_status("✔".
|
47
|
+
say_status("✔".green, header: false)
|
48
48
|
else
|
49
49
|
slices = files.each_slice(INVALIDATION_LIMIT)
|
50
50
|
say_status("Invalidating #{files.count} files in #{slices.count} batch(es) ")
|
@@ -52,7 +52,7 @@ module Middleman
|
|
52
52
|
say_status("Invalidating batch #{i + 1}... ", newline: false)
|
53
53
|
invalidation = distribution.invalidations.create(:paths => slice)
|
54
54
|
invalidation.wait_for { ready? } unless i == slices.count - 1
|
55
|
-
say_status("✔".
|
55
|
+
say_status("✔".green, header: false)
|
56
56
|
end
|
57
57
|
end
|
58
58
|
say_status("It might take 10 to 15 minutes until all files are invalidated.")
|
@@ -17,19 +17,19 @@ module Middleman
|
|
17
17
|
}
|
18
18
|
end
|
19
19
|
|
20
|
-
def invalidate(options, files)
|
20
|
+
def invalidate(options, files, all: false)
|
21
21
|
options[:api_key] ||= ENV['FASTLY_API_KEY']
|
22
22
|
|
23
23
|
[:api_key, :base_urls].each do |key|
|
24
24
|
if options[key].blank?
|
25
|
-
say_status("Error: Configuration key fastly[:#{key}] is missing.".
|
25
|
+
say_status("Error: Configuration key fastly[:#{key}] is missing.".red)
|
26
26
|
raise
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
options[:base_urls] = [options[:base_urls]] if options[:base_urls].is_a?(String)
|
31
31
|
if !options[:base_urls].is_a?(Array)
|
32
|
-
say_status("Error: Configuration key fastly[:base_urls] must be an array and contain at least one base url.".
|
32
|
+
say_status("Error: Configuration key fastly[:base_urls] must be an array and contain at least one base url.".red)
|
33
33
|
raise
|
34
34
|
end
|
35
35
|
|
@@ -44,9 +44,9 @@ module Middleman
|
|
44
44
|
say_status("Invalidating #{url}... ", newline: false)
|
45
45
|
fastly.purge("#{base_url}#{file}")
|
46
46
|
rescue => e
|
47
|
-
say_status(", " + "error: #{e.message}".
|
47
|
+
say_status(", " + "error: #{e.message}".red, header: false)
|
48
48
|
else
|
49
|
-
say_status("✔".
|
49
|
+
say_status("✔".green, header: false)
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
@@ -19,14 +19,14 @@ module Middleman
|
|
19
19
|
}
|
20
20
|
end
|
21
21
|
|
22
|
-
def invalidate(options, files)
|
22
|
+
def invalidate(options, files, all: false)
|
23
23
|
options[:alias] ||= ENV['MAXCDN_ALIAS']
|
24
24
|
options[:consumer_key] ||= ENV['MAXCDN_CONSUMER_KEY']
|
25
25
|
options[:consumer_secret] ||= ENV['MAXCDN_CONSUMER_SECRET']
|
26
26
|
|
27
27
|
[:alias, :consumer_key, :consumer_secret, :zone_id].each do |key|
|
28
28
|
if options[key].blank?
|
29
|
-
say_status("Error: Configuration key maxcdn[:#{key}] is missing.".
|
29
|
+
say_status("Error: Configuration key maxcdn[:#{key}] is missing.".red)
|
30
30
|
raise
|
31
31
|
end
|
32
32
|
end
|
@@ -37,9 +37,9 @@ module Middleman
|
|
37
37
|
say_status("Invalidating #{files.count} files...", newline: false)
|
38
38
|
maxcdn.purge(options[:zone_id], files)
|
39
39
|
rescue => e
|
40
|
-
say_status(", " + "error: #{e.message}".
|
40
|
+
say_status(", " + "error: #{e.message}".red, header: false)
|
41
41
|
else
|
42
|
-
say_status("✔".
|
42
|
+
say_status("✔".green, header: false)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -22,13 +22,13 @@ module Middleman
|
|
22
22
|
}
|
23
23
|
end
|
24
24
|
|
25
|
-
def invalidate(options, files)
|
25
|
+
def invalidate(options, files, all: false)
|
26
26
|
options[:username] ||= ENV['RACKSPACE_USERNAME']
|
27
27
|
options[:api_key] ||= ENV['RACKSPACE_API_KEY']
|
28
28
|
|
29
29
|
[:username, :api_key, :region, :container].each do |key|
|
30
30
|
if options[key].blank?
|
31
|
-
say_status("Error: Configuration key rackspace[:#{key}] is missing.".
|
31
|
+
say_status("Error: Configuration key rackspace[:#{key}] is missing.".red)
|
32
32
|
raise
|
33
33
|
end
|
34
34
|
end
|
@@ -54,9 +54,9 @@ module Middleman
|
|
54
54
|
say_status("Invalidating #{file}...", newline: false)
|
55
55
|
rackspace_client.invalidate(region, container, file, notification_email: notification_email)
|
56
56
|
rescue => e
|
57
|
-
say_status(" error: #{e.message}".
|
57
|
+
say_status(" error: #{e.message}".red, header: false)
|
58
58
|
else
|
59
|
-
say_status("✔".
|
59
|
+
say_status("✔".green, header: false)
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
@@ -28,7 +28,7 @@ module Middleman
|
|
28
28
|
if options.nil?
|
29
29
|
app_instance = ::Middleman::Application.server.inst
|
30
30
|
unless app_instance.respond_to?(:cdn_options)
|
31
|
-
self.class.say_status(nil, "Error: You need to activate the cdn extension in config.rb.\n#{example_configuration}".
|
31
|
+
self.class.say_status(nil, "Error: You need to activate the cdn extension in config.rb.\n#{example_configuration}".red)
|
32
32
|
raise
|
33
33
|
end
|
34
34
|
options = app_instance.cdn_options
|
@@ -36,18 +36,20 @@ module Middleman
|
|
36
36
|
options.filter ||= /.*/
|
37
37
|
|
38
38
|
if cdns.all? { |cdn| options.public_send(cdn.key.to_sym).nil? }
|
39
|
-
self.class.say_status(nil, "Error: You must specify a config for one of the supported CDNs.\n#{example_configuration}".
|
39
|
+
self.class.say_status(nil, "Error: You must specify a config for one of the supported CDNs.\n#{example_configuration}".red)
|
40
40
|
raise
|
41
41
|
end
|
42
42
|
|
43
43
|
files = list_files(options.filter)
|
44
|
-
self.class.say_status(nil, "Invalidating #{files.count} files with filter: " + "#{options.filter.source}"
|
44
|
+
self.class.say_status(nil, "Invalidating #{files.count} files with filter: " + "#{options.filter.source}")
|
45
45
|
files.each { |file| self.class.say_status(nil, " • #{file}") }
|
46
46
|
return if files.empty?
|
47
47
|
|
48
|
+
invalidate_all = does_filter_match_all(options.filter)
|
49
|
+
|
48
50
|
cdns_keyed.each do |cdn_key, cdn|
|
49
51
|
cdn_options = options.public_send(cdn_key.to_sym)
|
50
|
-
cdn.new.invalidate(cdn_options, files) unless cdn_options.nil?
|
52
|
+
cdn.new.invalidate(cdn_options, files, all: invalidate_all) unless cdn_options.nil?
|
51
53
|
end
|
52
54
|
rescue SystemExit, Interrupt
|
53
55
|
self.class.say_status(nil, nil, header: false)
|
@@ -56,7 +58,7 @@ module Middleman
|
|
56
58
|
|
57
59
|
def self.say_status(cdn, status, newline: true, header: true, wait_enter: false)
|
58
60
|
message = ""
|
59
|
-
message << "#{:cdn.to_s.rjust(12).
|
61
|
+
message << "#{:cdn.to_s.rjust(12).green} #{cdn.try(:yellow)}" if header
|
60
62
|
message << " " if header && cdn
|
61
63
|
message << status if status
|
62
64
|
print message
|
@@ -92,6 +94,10 @@ end
|
|
92
94
|
TEXT
|
93
95
|
end
|
94
96
|
|
97
|
+
def does_filter_match_all(filter)
|
98
|
+
[".*", ".+"].include?(filter.source)
|
99
|
+
end
|
100
|
+
|
95
101
|
def list_files(filter)
|
96
102
|
Dir.chdir('build/') do
|
97
103
|
Dir.glob('**/*', File::FNM_DOTMATCH).tap do |files|
|
data/middleman-cdn.gemspec
CHANGED
@@ -73,6 +73,22 @@ describe Middleman::Cli::CloudFlareCDN do
|
|
73
73
|
expect { subject.invalidate(options, files) }.to output(/✔/).to_stdout
|
74
74
|
end
|
75
75
|
|
76
|
+
context "matches all files" do
|
77
|
+
before do
|
78
|
+
allow(double_cloudflare).to receive(:fpurge_ts)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should invalidate the entire zone" do
|
82
|
+
expect(double_cloudflare).to receive(:fpurge_ts).once.with("example.com")
|
83
|
+
subject.invalidate(options, files, all: true)
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should not invalidate individual files" do
|
87
|
+
expect(double_cloudflare).not_to receive(:zone_file_purge)
|
88
|
+
subject.invalidate(options, files, all: true)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
76
92
|
context "and errors occurs when purging" do
|
77
93
|
before do
|
78
94
|
allow(double_cloudflare).to receive(:zone_file_purge).and_raise(StandardError)
|
@@ -51,7 +51,7 @@ describe Middleman::Cli::CDN do
|
|
51
51
|
end
|
52
52
|
|
53
53
|
it "should invalidate the files with only cloudflare" do
|
54
|
-
expect_any_instance_of(::Middleman::Cli::CloudFlareCDN).to receive(:invalidate).with(options.cloudflare, ["/index.html", "/image.png", "/"])
|
54
|
+
expect_any_instance_of(::Middleman::Cli::CloudFlareCDN).to receive(:invalidate).with(options.cloudflare, ["/index.html", "/image.png", "/"], all: true)
|
55
55
|
expect_any_instance_of(::Middleman::Cli::CloudFrontCDN).to_not receive(:invalidate)
|
56
56
|
expect_any_instance_of(::Middleman::Cli::FastlyCDN).to_not receive(:invalidate)
|
57
57
|
subject.cdn_invalidate(options)
|
@@ -69,9 +69,9 @@ describe Middleman::Cli::CDN do
|
|
69
69
|
end
|
70
70
|
|
71
71
|
it "should invalidate the files with all cdns" do
|
72
|
-
expect_any_instance_of(::Middleman::Cli::CloudFlareCDN).to receive(:invalidate).with(options.cloudflare, ["/index.html", "/image.png", "/"])
|
73
|
-
expect_any_instance_of(::Middleman::Cli::CloudFrontCDN).to receive(:invalidate).with(options.cloudfront, ["/index.html", "/image.png", "/"])
|
74
|
-
expect_any_instance_of(::Middleman::Cli::FastlyCDN).to receive(:invalidate).with(options.fastly, ["/index.html", "/image.png", "/"])
|
72
|
+
expect_any_instance_of(::Middleman::Cli::CloudFlareCDN).to receive(:invalidate).with(options.cloudflare, ["/index.html", "/image.png", "/"], all: true)
|
73
|
+
expect_any_instance_of(::Middleman::Cli::CloudFrontCDN).to receive(:invalidate).with(options.cloudfront, ["/index.html", "/image.png", "/"], all: true)
|
74
|
+
expect_any_instance_of(::Middleman::Cli::FastlyCDN).to receive(:invalidate).with(options.fastly, ["/index.html", "/image.png", "/"], all: true)
|
75
75
|
subject.cdn_invalidate(options)
|
76
76
|
end
|
77
77
|
end
|
@@ -88,9 +88,9 @@ describe Middleman::Cli::CDN do
|
|
88
88
|
end
|
89
89
|
|
90
90
|
it "should invalidate the files with all cdns" do
|
91
|
-
expect_any_instance_of(::Middleman::Cli::CloudFlareCDN).to receive(:invalidate).with(options.cloudflare, ["/index.html", "/"])
|
92
|
-
expect_any_instance_of(::Middleman::Cli::CloudFrontCDN).to receive(:invalidate).with(options.cloudfront, ["/index.html", "/"])
|
93
|
-
expect_any_instance_of(::Middleman::Cli::FastlyCDN).to receive(:invalidate).with(options.cloudfront, ["/index.html", "/"])
|
91
|
+
expect_any_instance_of(::Middleman::Cli::CloudFlareCDN).to receive(:invalidate).with(options.cloudflare, ["/index.html", "/"], all: false)
|
92
|
+
expect_any_instance_of(::Middleman::Cli::CloudFrontCDN).to receive(:invalidate).with(options.cloudfront, ["/index.html", "/"], all: false)
|
93
|
+
expect_any_instance_of(::Middleman::Cli::FastlyCDN).to receive(:invalidate).with(options.cloudfront, ["/index.html", "/"], all: false)
|
94
94
|
subject.cdn_invalidate(options)
|
95
95
|
end
|
96
96
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: middleman-cdn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leigh McCulloch
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fog
|
@@ -156,14 +156,14 @@ dependencies:
|
|
156
156
|
requirements:
|
157
157
|
- - "~>"
|
158
158
|
- !ruby/object:Gem::Version
|
159
|
-
version: '3.
|
159
|
+
version: '3.3'
|
160
160
|
type: :runtime
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
164
|
- - "~>"
|
165
165
|
- !ruby/object:Gem::Version
|
166
|
-
version: '3.
|
166
|
+
version: '3.3'
|
167
167
|
description: Invalidate a specific set of files in your CloudFlare or CloudFront cache
|
168
168
|
email:
|
169
169
|
executables: []
|