middleman-s3_sync 3.0.10 → 3.0.11
Sign up to get free protection for your applications and to get access to all the features.
- data/Changelog.md +10 -0
- data/README.md +19 -0
- data/lib/middleman-s3_sync.rb +77 -100
- data/lib/middleman-s3_sync/commands.rb +8 -3
- data/lib/middleman-s3_sync/extension.rb +8 -6
- data/lib/middleman-s3_sync/version.rb +1 -1
- data/lib/middleman/s3_sync/resource.rb +168 -0
- data/lib/middleman/s3_sync/status.rb +11 -0
- data/middleman-s3_sync.gemspec +3 -1
- metadata +58 -23
data/Changelog.md
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# Middleman::S3Sync Changelog
|
2
|
+
|
3
|
+
## v3.0.11
|
4
|
+
|
5
|
+
* Adds support for GZipped resources (fixes #3)
|
6
|
+
* Quiets Fog's warning messages (fixes #10)
|
7
|
+
* Rename the options method to s3_sync_options to remove a method name collision (fixes #9)
|
8
|
+
* Colorize the output.
|
9
|
+
|
10
|
+
|
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# Middleman::S3Sync
|
2
2
|
|
3
|
+
[![Code
|
4
|
+
Climate](https://codeclimate.com/github/fredjean/middleman-s3_sync.png)](https://codeclimate.com/github/fredjean/middleman-s3_sync)
|
5
|
+
|
3
6
|
This gem determines which files need to be added, updated and optionally deleted
|
4
7
|
and only transfer these files up. This reduces the impact of an update
|
5
8
|
on a web site hosted on S3.
|
@@ -38,6 +41,7 @@ activate :s3_sync do |s3_sync|
|
|
38
41
|
s3_sync.aws_secret_access_key = 'AWS SECRET KEY'
|
39
42
|
s3_sync.delete = false # We delete stray files by default.
|
40
43
|
s3_sync.after_build = false # We chain after the build step by default. This may not be your desired behavior...
|
44
|
+
s3_sync.prefer_gzip = true
|
41
45
|
end
|
42
46
|
```
|
43
47
|
|
@@ -50,6 +54,13 @@ such case, you can pass the ```--force``` option:
|
|
50
54
|
|
51
55
|
$ middleman s3_sync --force
|
52
56
|
|
57
|
+
## Overriding the destination bucket
|
58
|
+
|
59
|
+
You can now override the destination bucket using the --bucket switch.
|
60
|
+
The command is:
|
61
|
+
|
62
|
+
$ middleman s3_sync --bucket=my.new.bucket
|
63
|
+
|
53
64
|
## HTTP Caching
|
54
65
|
|
55
66
|
By default, ```middleman-s3_sync``` does not set caching headers. In
|
@@ -121,6 +132,14 @@ are (I'm looking at you Chrome!). Setting the `Cache-Control` or
|
|
121
132
|
that stand between them and your content will behave the way you want
|
122
133
|
them to. YMMV.
|
123
134
|
|
135
|
+
### GZipped Content Encoding
|
136
|
+
|
137
|
+
You can set the ```prefer_gzip``` option to look for a gzipped version
|
138
|
+
of a resource. The gzipped version of the resource will be pushed to S3
|
139
|
+
instead of the original and the ```Content-Encoding``` and ```Content-Type```
|
140
|
+
headers will be set correctly. This will cause Amazon to serve the
|
141
|
+
compressed version of the resource.
|
142
|
+
|
124
143
|
## A Debt of Gratitude
|
125
144
|
|
126
145
|
I used Middleman Sync as a template for building a Middleman extension.
|
data/lib/middleman-s3_sync.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
require 'middleman-core'
|
2
2
|
require 'fog'
|
3
|
-
require '
|
3
|
+
require 'pmap'
|
4
|
+
require 'ruby-progressbar'
|
4
5
|
require 'digest/md5'
|
5
6
|
require 'middleman-s3_sync/version'
|
6
7
|
require 'middleman-s3_sync/commands'
|
8
|
+
require 'middleman/s3_sync/status'
|
9
|
+
require 'middleman/s3_sync/resource'
|
10
|
+
|
11
|
+
Fog::Logger[:warning] = nil
|
7
12
|
|
8
13
|
::Middleman::Extensions.register(:s3_sync, '>= 3.0.0') do
|
9
14
|
require 'middleman-s3_sync/extension'
|
@@ -13,140 +18,112 @@ end
|
|
13
18
|
module Middleman
|
14
19
|
module S3Sync
|
15
20
|
class << self
|
21
|
+
include Status
|
22
|
+
|
16
23
|
def sync
|
17
|
-
|
18
|
-
|
24
|
+
unless work_to_be_done?
|
25
|
+
say_status "\nAll S3 files are up to date."
|
19
26
|
return
|
20
27
|
end
|
21
28
|
|
22
|
-
|
23
|
-
|
24
|
-
files_to_create.each do |f|
|
25
|
-
puts "Creating #{f}"
|
26
|
-
file_hash = {
|
27
|
-
:key => f,
|
28
|
-
:body => File.open(local_path(f)),
|
29
|
-
:public => true,
|
30
|
-
:acl => 'public-read',
|
31
|
-
:content_type => MIME::Types.of(f).first
|
32
|
-
}
|
33
|
-
|
34
|
-
# Add cache-control headers
|
35
|
-
if policy = options.caching_policy_for(file_hash[:content_type])
|
36
|
-
file_hash[:cache_control] = policy.cache_control if policy.cache_control
|
37
|
-
file_hash[:expires] = policy.expires if policy.expires
|
38
|
-
end
|
39
|
-
|
40
|
-
bucket.files.create(file_hash)
|
41
|
-
end
|
29
|
+
say_status "\nReady to apply updates to #{s3_sync_options.bucket}."
|
42
30
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
file.public = true
|
48
|
-
file.content_type = MIME::Types.of(f).first
|
49
|
-
if policy = options.caching_policy_for(file.content_type)
|
50
|
-
file.cache_control = policy.cache_control if policy.cache_control
|
51
|
-
file.expires = policy.expires if policy.expires
|
52
|
-
end
|
53
|
-
|
54
|
-
file.save
|
55
|
-
end
|
31
|
+
create_resources
|
32
|
+
update_resources
|
33
|
+
delete_resources
|
34
|
+
end
|
56
35
|
|
57
|
-
|
58
|
-
|
59
|
-
if file = s3_files.get(f)
|
60
|
-
file.destroy
|
61
|
-
end
|
62
|
-
end
|
36
|
+
def bucket
|
37
|
+
@bucket ||= connection.directories.get(s3_sync_options.bucket)
|
63
38
|
end
|
64
39
|
|
65
40
|
protected
|
66
41
|
def connection
|
67
42
|
@connection ||= Fog::Storage.new({
|
68
43
|
:provider => 'AWS',
|
69
|
-
:aws_access_key_id =>
|
70
|
-
:aws_secret_access_key =>
|
71
|
-
:region =>
|
44
|
+
:aws_access_key_id => s3_sync_options.aws_access_key_id,
|
45
|
+
:aws_secret_access_key => s3_sync_options.aws_secret_access_key,
|
46
|
+
:region => s3_sync_options.region
|
72
47
|
})
|
73
48
|
end
|
74
49
|
|
75
|
-
def
|
76
|
-
@
|
50
|
+
def resources
|
51
|
+
@resources ||= paths.pmap do |p|
|
52
|
+
progress_bar.increment
|
53
|
+
S3Sync::Resource.new(p)
|
54
|
+
end
|
77
55
|
end
|
78
56
|
|
79
|
-
def
|
80
|
-
@
|
57
|
+
def progress_bar
|
58
|
+
@progress_bar ||= ProgressBar.create(total: paths.length)
|
81
59
|
end
|
82
60
|
|
83
|
-
def
|
84
|
-
@
|
85
|
-
|
86
|
-
|
87
|
-
|
61
|
+
def paths
|
62
|
+
@paths ||= begin
|
63
|
+
say_status "Gathering the paths to evaluate."
|
64
|
+
(remote_paths + local_paths).uniq.sort
|
65
|
+
end
|
88
66
|
end
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
(Dir[build_dir + "/**/*"] + Dir[build_dir + "/**/.*"])
|
93
|
-
|
94
|
-
|
67
|
+
|
68
|
+
def local_paths
|
69
|
+
@local_paths ||= begin
|
70
|
+
local_paths = (Dir[build_dir + "/**/*"] + Dir[build_dir + "/**/.*"])
|
71
|
+
.reject { |p| File.directory?(p) }
|
72
|
+
|
73
|
+
if s3_sync_options.prefer_gzip
|
74
|
+
local_paths.reject! { |p| p =~ /\.gz$/ && File.exist?(p.gsub(/\.gz$/, '')) }
|
75
|
+
end
|
76
|
+
|
77
|
+
local_paths.pmap { |p| p.gsub(/#{build_dir}\//, '') }
|
95
78
|
end
|
96
79
|
end
|
97
80
|
|
98
|
-
def
|
99
|
-
@
|
100
|
-
if options.delete
|
101
|
-
puts "\nDetermine which files to delete from #{options.bucket}"
|
102
|
-
remote_files - local_files
|
103
|
-
else
|
104
|
-
[]
|
105
|
-
end
|
106
|
-
end
|
81
|
+
def remote_paths
|
82
|
+
@remote_paths ||= bucket.files.map{ |f| f.key }
|
107
83
|
end
|
108
84
|
|
109
|
-
def
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
end
|
85
|
+
def create_resources
|
86
|
+
files_to_create.each do |r|
|
87
|
+
r.create!
|
88
|
+
end
|
114
89
|
end
|
115
90
|
|
116
|
-
def
|
117
|
-
|
118
|
-
|
119
|
-
|
91
|
+
def update_resources
|
92
|
+
files_to_update.each do |r|
|
93
|
+
r.update!
|
94
|
+
end
|
120
95
|
end
|
121
96
|
|
122
|
-
def
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
end
|
138
|
-
end
|
139
|
-
puts ""
|
140
|
-
files_to_update
|
97
|
+
def delete_resources
|
98
|
+
files_to_delete.each do |r|
|
99
|
+
r.destroy!
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def work_to_be_done?
|
104
|
+
!(files_to_create.empty? && files_to_update.empty? && files_to_delete.empty?)
|
105
|
+
end
|
106
|
+
|
107
|
+
def files_to_delete
|
108
|
+
@files_to_delete ||= if s3_sync_options.delete
|
109
|
+
resources.select { |r| r.to_delete? }
|
110
|
+
else
|
111
|
+
[]
|
141
112
|
end
|
142
113
|
end
|
143
114
|
|
144
|
-
def
|
145
|
-
|
115
|
+
def files_to_create
|
116
|
+
@files_to_create ||= resources.select { |r| r.to_create? }
|
117
|
+
end
|
118
|
+
|
119
|
+
def files_to_update
|
120
|
+
return resources.select { |r| r.local? } if s3_sync_options.force
|
121
|
+
|
122
|
+
@files_to_update ||= resources.select { |r| r.to_update? }
|
146
123
|
end
|
147
124
|
|
148
125
|
def build_dir
|
149
|
-
@build_dir ||=
|
126
|
+
@build_dir ||= s3_sync_options.build_dir
|
150
127
|
end
|
151
128
|
end
|
152
129
|
end
|
@@ -18,16 +18,21 @@ module Middleman
|
|
18
18
|
option :bucket, type: :string,
|
19
19
|
desc: "Specify which bucket to use, overrides the configured bucket.",
|
20
20
|
aliases: :b
|
21
|
+
option :verbose, type: :boolean,
|
22
|
+
desc: "Adds more verbosity...",
|
23
|
+
aliases: :v
|
21
24
|
|
22
25
|
def s3_sync
|
23
26
|
shared_inst = ::Middleman::Application.server.inst
|
24
|
-
bucket = shared_inst.
|
27
|
+
bucket = shared_inst.s3_sync_options.bucket
|
25
28
|
if (!bucket)
|
26
29
|
raise Thor::Error.new "You need to activate this extension."
|
27
30
|
end
|
28
31
|
|
29
|
-
|
30
|
-
shared_inst.
|
32
|
+
# Override options based on what was passed on the command line...
|
33
|
+
shared_inst.s3_sync_options.force = options[:force] if options[:force]
|
34
|
+
shared_inst.s3_sync_options.bucket = options[:bucket] if options[:bucket]
|
35
|
+
shared_inst.s3_sync_options.verbose = options[:verbose] if options[:verbose]
|
31
36
|
|
32
37
|
::Middleman::S3Sync.sync
|
33
38
|
end
|
@@ -13,7 +13,9 @@ module Middleman
|
|
13
13
|
:delete,
|
14
14
|
:existing_remote_file,
|
15
15
|
:build_dir,
|
16
|
-
:force
|
16
|
+
:force,
|
17
|
+
:prefer_gzip,
|
18
|
+
:verbose
|
17
19
|
)
|
18
20
|
|
19
21
|
def add_caching_policy(content_type, options)
|
@@ -66,7 +68,7 @@ module Middleman
|
|
66
68
|
end
|
67
69
|
|
68
70
|
class << self
|
69
|
-
def
|
71
|
+
def s3_sync_options
|
70
72
|
@@options
|
71
73
|
end
|
72
74
|
|
@@ -90,16 +92,16 @@ module Middleman
|
|
90
92
|
alias :included :registered
|
91
93
|
|
92
94
|
module Helpers
|
93
|
-
def
|
94
|
-
::Middleman::S3Sync.
|
95
|
+
def s3_sync_options
|
96
|
+
::Middleman::S3Sync.s3_sync_options
|
95
97
|
end
|
96
98
|
|
97
99
|
def default_caching_policy(policy = {})
|
98
|
-
|
100
|
+
s3_sync_options.add_caching_policy(:default, policy)
|
99
101
|
end
|
100
102
|
|
101
103
|
def caching_policy(content_type, policy = {})
|
102
|
-
|
104
|
+
s3_sync_options.add_caching_policy(content_type, policy)
|
103
105
|
end
|
104
106
|
end
|
105
107
|
end
|
@@ -0,0 +1,168 @@
|
|
1
|
+
module Middleman
|
2
|
+
module S3Sync
|
3
|
+
class Resource
|
4
|
+
attr_accessor :path, :s3_resource, :content_type, :gzipped
|
5
|
+
|
6
|
+
CONTENT_MD5_KEY = 'x-amz-meta-content-md5'
|
7
|
+
|
8
|
+
include Status
|
9
|
+
|
10
|
+
def initialize(path)
|
11
|
+
@path = path
|
12
|
+
@s3_resource = bucket.files.get(path) rescue nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def remote_path
|
16
|
+
s3_resource ? s3_resource.key : path
|
17
|
+
end
|
18
|
+
alias :key :remote_path
|
19
|
+
|
20
|
+
def to_h
|
21
|
+
attributes = {
|
22
|
+
:key => key,
|
23
|
+
:body => body,
|
24
|
+
:public => true,
|
25
|
+
:acl => 'public-read',
|
26
|
+
:content_type => content_type,
|
27
|
+
CONTENT_MD5_KEY => content_md5
|
28
|
+
}
|
29
|
+
|
30
|
+
if caching_policy
|
31
|
+
attributes[:cache_control] = caching_policy.cache_control
|
32
|
+
attributes[:expires] = caching_policy.expires
|
33
|
+
end
|
34
|
+
|
35
|
+
if options.prefer_gzip && gzipped
|
36
|
+
attributes[:content_encoding] = "gzip"
|
37
|
+
end
|
38
|
+
|
39
|
+
attributes
|
40
|
+
end
|
41
|
+
alias :attributes :to_h
|
42
|
+
|
43
|
+
def update!
|
44
|
+
say_status "Updating".blue + " #{path}#{ gzipped ? ' (gzipped)'.white : ''}"
|
45
|
+
if options.verbose
|
46
|
+
say_status "Original: #{original_path.white}"
|
47
|
+
say_status "Local Path: #{local_path.white}"
|
48
|
+
say_status "remote md5: #{remote_md5.white}"
|
49
|
+
say_status "content md5: #{content_md5.white}"
|
50
|
+
end
|
51
|
+
s3_resource.body = body
|
52
|
+
s3_resource.public = true
|
53
|
+
s3_resource.acl = 'public-read'
|
54
|
+
s3_resource.content_type = content_type
|
55
|
+
s3_resource.metadata = { CONTENT_MD5_KEY => content_md5 }
|
56
|
+
|
57
|
+
if caching_policy
|
58
|
+
s3_resource.cache_control = caching_policy.cache_control
|
59
|
+
s3_resource.expires = caching_policy.expires
|
60
|
+
end
|
61
|
+
|
62
|
+
if options.prefer_gzip && gzipped
|
63
|
+
s3_resource.content_encoding = "gzip"
|
64
|
+
end
|
65
|
+
|
66
|
+
s3_resource.save
|
67
|
+
end
|
68
|
+
|
69
|
+
def local_path
|
70
|
+
local_path = build_dir + '/' + path
|
71
|
+
if options.prefer_gzip && File.exist?(local_path + ".gz")
|
72
|
+
@gzipped = true
|
73
|
+
local_path += ".gz"
|
74
|
+
end
|
75
|
+
local_path
|
76
|
+
end
|
77
|
+
|
78
|
+
def destroy!
|
79
|
+
say_status "Deleting".red + " #{path}".red
|
80
|
+
s3_resource.destroy
|
81
|
+
end
|
82
|
+
|
83
|
+
def create!
|
84
|
+
say_status "Creating".green + " #{path}#{ gzipped ? ' (gzipped)'.white : ''}"
|
85
|
+
bucket.files.create(to_h)
|
86
|
+
end
|
87
|
+
|
88
|
+
def to_delete?
|
89
|
+
status == :deleted
|
90
|
+
end
|
91
|
+
|
92
|
+
def to_create?
|
93
|
+
status == :new
|
94
|
+
end
|
95
|
+
|
96
|
+
def identical?
|
97
|
+
status == :identical
|
98
|
+
end
|
99
|
+
|
100
|
+
def to_update?
|
101
|
+
status == :updated
|
102
|
+
end
|
103
|
+
|
104
|
+
def body
|
105
|
+
@body = File.open(local_path)
|
106
|
+
end
|
107
|
+
|
108
|
+
def status
|
109
|
+
@status ||= if local? && remote?
|
110
|
+
if content_md5 != remote_md5
|
111
|
+
:updated
|
112
|
+
else
|
113
|
+
:identical
|
114
|
+
end
|
115
|
+
elsif local?
|
116
|
+
:new
|
117
|
+
else
|
118
|
+
:deleted
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def local?
|
123
|
+
File.exist?(local_path)
|
124
|
+
end
|
125
|
+
|
126
|
+
def remote?
|
127
|
+
s3_resource
|
128
|
+
end
|
129
|
+
|
130
|
+
def relative_path
|
131
|
+
@relative_path ||= local_path.gsub(/#{build_dir}/, '')
|
132
|
+
end
|
133
|
+
|
134
|
+
def remote_md5
|
135
|
+
s3_resource.metadata[CONTENT_MD5_KEY] || s3_resource.etag
|
136
|
+
end
|
137
|
+
|
138
|
+
def content_md5
|
139
|
+
@content_md5 ||= Digest::MD5.hexdigest(File.read(original_path))
|
140
|
+
end
|
141
|
+
|
142
|
+
def original_path
|
143
|
+
gzipped ? local_path.gsub(/\.gz$/, '') : local_path
|
144
|
+
end
|
145
|
+
|
146
|
+
def content_type
|
147
|
+
@content_type ||= MIME::Types.of(path).first
|
148
|
+
end
|
149
|
+
|
150
|
+
def caching_policy
|
151
|
+
@caching_policy ||= options.caching_policy_for(content_type)
|
152
|
+
end
|
153
|
+
|
154
|
+
protected
|
155
|
+
def bucket
|
156
|
+
Middleman::S3Sync.bucket
|
157
|
+
end
|
158
|
+
|
159
|
+
def build_dir
|
160
|
+
options.build_dir
|
161
|
+
end
|
162
|
+
|
163
|
+
def options
|
164
|
+
Middleman::S3Sync.s3_sync_options
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
data/middleman-s3_sync.gemspec
CHANGED
@@ -19,8 +19,10 @@ Gem::Specification.new do |gem|
|
|
19
19
|
|
20
20
|
gem.add_runtime_dependency 'middleman-core', '>= 3.0.0'
|
21
21
|
gem.add_runtime_dependency 'fog'
|
22
|
-
gem.add_runtime_dependency 'parallel'
|
23
22
|
gem.add_runtime_dependency 'map'
|
23
|
+
gem.add_runtime_dependency 'pmap'
|
24
|
+
gem.add_runtime_dependency 'ruby-progressbar'
|
25
|
+
gem.add_runtime_dependency 'colorize'
|
24
26
|
|
25
27
|
gem.add_development_dependency 'rake'
|
26
28
|
gem.add_development_dependency 'pry'
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: middleman-s3_sync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
version: 3.0.11
|
4
5
|
prerelease:
|
5
|
-
version: 3.0.10
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Frederic Jean
|
@@ -10,33 +10,42 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-05-15 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
|
16
|
+
name: middleman-core
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
17
18
|
none: false
|
18
19
|
requirements:
|
19
20
|
- - ! '>='
|
20
21
|
- !ruby/object:Gem::Version
|
21
22
|
version: 3.0.0
|
22
|
-
|
23
|
+
type: :runtime
|
23
24
|
prerelease: false
|
24
|
-
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
26
|
none: false
|
26
27
|
requirements:
|
27
28
|
- - ! '>='
|
28
29
|
- !ruby/object:Gem::Version
|
29
30
|
version: 3.0.0
|
30
|
-
type: :runtime
|
31
31
|
- !ruby/object:Gem::Dependency
|
32
|
-
|
32
|
+
name: fog
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
33
34
|
none: false
|
34
35
|
requirements:
|
35
36
|
- - ! '>='
|
36
37
|
- !ruby/object:Gem::Version
|
37
38
|
version: '0'
|
38
|
-
|
39
|
+
type: :runtime
|
39
40
|
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: map
|
40
49
|
requirement: !ruby/object:Gem::Requirement
|
41
50
|
none: false
|
42
51
|
requirements:
|
@@ -44,15 +53,15 @@ dependencies:
|
|
44
53
|
- !ruby/object:Gem::Version
|
45
54
|
version: '0'
|
46
55
|
type: :runtime
|
47
|
-
|
56
|
+
prerelease: false
|
48
57
|
version_requirements: !ruby/object:Gem::Requirement
|
49
58
|
none: false
|
50
59
|
requirements:
|
51
60
|
- - ! '>='
|
52
61
|
- !ruby/object:Gem::Version
|
53
62
|
version: '0'
|
54
|
-
|
55
|
-
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: pmap
|
56
65
|
requirement: !ruby/object:Gem::Requirement
|
57
66
|
none: false
|
58
67
|
requirements:
|
@@ -60,15 +69,15 @@ dependencies:
|
|
60
69
|
- !ruby/object:Gem::Version
|
61
70
|
version: '0'
|
62
71
|
type: :runtime
|
63
|
-
|
72
|
+
prerelease: false
|
64
73
|
version_requirements: !ruby/object:Gem::Requirement
|
65
74
|
none: false
|
66
75
|
requirements:
|
67
76
|
- - ! '>='
|
68
77
|
- !ruby/object:Gem::Version
|
69
78
|
version: '0'
|
70
|
-
|
71
|
-
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: ruby-progressbar
|
72
81
|
requirement: !ruby/object:Gem::Requirement
|
73
82
|
none: false
|
74
83
|
requirements:
|
@@ -76,15 +85,31 @@ dependencies:
|
|
76
85
|
- !ruby/object:Gem::Version
|
77
86
|
version: '0'
|
78
87
|
type: :runtime
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
79
95
|
- !ruby/object:Gem::Dependency
|
96
|
+
name: colorize
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
type: :runtime
|
104
|
+
prerelease: false
|
80
105
|
version_requirements: !ruby/object:Gem::Requirement
|
81
106
|
none: false
|
82
107
|
requirements:
|
83
108
|
- - ! '>='
|
84
109
|
- !ruby/object:Gem::Version
|
85
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
86
112
|
name: rake
|
87
|
-
prerelease: false
|
88
113
|
requirement: !ruby/object:Gem::Requirement
|
89
114
|
none: false
|
90
115
|
requirements:
|
@@ -92,15 +117,15 @@ dependencies:
|
|
92
117
|
- !ruby/object:Gem::Version
|
93
118
|
version: '0'
|
94
119
|
type: :development
|
95
|
-
|
120
|
+
prerelease: false
|
96
121
|
version_requirements: !ruby/object:Gem::Requirement
|
97
122
|
none: false
|
98
123
|
requirements:
|
99
124
|
- - ! '>='
|
100
125
|
- !ruby/object:Gem::Version
|
101
126
|
version: '0'
|
127
|
+
- !ruby/object:Gem::Dependency
|
102
128
|
name: pry
|
103
|
-
prerelease: false
|
104
129
|
requirement: !ruby/object:Gem::Requirement
|
105
130
|
none: false
|
106
131
|
requirements:
|
@@ -108,15 +133,15 @@ dependencies:
|
|
108
133
|
- !ruby/object:Gem::Version
|
109
134
|
version: '0'
|
110
135
|
type: :development
|
111
|
-
|
136
|
+
prerelease: false
|
112
137
|
version_requirements: !ruby/object:Gem::Requirement
|
113
138
|
none: false
|
114
139
|
requirements:
|
115
140
|
- - ! '>='
|
116
141
|
- !ruby/object:Gem::Version
|
117
142
|
version: '0'
|
143
|
+
- !ruby/object:Gem::Dependency
|
118
144
|
name: pry-nav
|
119
|
-
prerelease: false
|
120
145
|
requirement: !ruby/object:Gem::Requirement
|
121
146
|
none: false
|
122
147
|
requirements:
|
@@ -124,6 +149,13 @@ dependencies:
|
|
124
149
|
- !ruby/object:Gem::Version
|
125
150
|
version: '0'
|
126
151
|
type: :development
|
152
|
+
prerelease: false
|
153
|
+
version_requirements: !ruby/object:Gem::Requirement
|
154
|
+
none: false
|
155
|
+
requirements:
|
156
|
+
- - ! '>='
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
127
159
|
description: Only syncs files that have been updated to S3.
|
128
160
|
email:
|
129
161
|
- fred@fredjean.net
|
@@ -132,6 +164,7 @@ extensions: []
|
|
132
164
|
extra_rdoc_files: []
|
133
165
|
files:
|
134
166
|
- .gitignore
|
167
|
+
- Changelog.md
|
135
168
|
- Gemfile
|
136
169
|
- LICENSE.txt
|
137
170
|
- README.md
|
@@ -140,6 +173,8 @@ files:
|
|
140
173
|
- lib/middleman-s3_sync/commands.rb
|
141
174
|
- lib/middleman-s3_sync/extension.rb
|
142
175
|
- lib/middleman-s3_sync/version.rb
|
176
|
+
- lib/middleman/s3_sync/resource.rb
|
177
|
+
- lib/middleman/s3_sync/status.rb
|
143
178
|
- lib/middleman_extension.rb
|
144
179
|
- middleman-s3_sync.gemspec
|
145
180
|
homepage: http://github.com/fredjean/middleman-s3_sync
|
@@ -153,19 +188,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
153
188
|
requirements:
|
154
189
|
- - ! '>='
|
155
190
|
- !ruby/object:Gem::Version
|
191
|
+
version: '0'
|
156
192
|
segments:
|
157
193
|
- 0
|
158
|
-
hash:
|
159
|
-
version: '0'
|
194
|
+
hash: 963813138401624681
|
160
195
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
161
196
|
none: false
|
162
197
|
requirements:
|
163
198
|
- - ! '>='
|
164
199
|
- !ruby/object:Gem::Version
|
200
|
+
version: '0'
|
165
201
|
segments:
|
166
202
|
- 0
|
167
|
-
hash:
|
168
|
-
version: '0'
|
203
|
+
hash: 963813138401624681
|
169
204
|
requirements: []
|
170
205
|
rubyforge_project:
|
171
206
|
rubygems_version: 1.8.23
|