s3_website 0.1.0

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 (101) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.travis.yml +5 -0
  4. data/Gemfile +3 -0
  5. data/Gemfile.lock +81 -0
  6. data/LICENSE +42 -0
  7. data/README.md +332 -0
  8. data/Rakefile +18 -0
  9. data/bin/s3_website +38 -0
  10. data/changelog.md +7 -0
  11. data/example-configurations.md +60 -0
  12. data/features/as-library.feature +29 -0
  13. data/features/cassettes/cucumber_tags/create-redirect.yml +384 -0
  14. data/features/cassettes/cucumber_tags/new-and-changed-files.yml +303 -0
  15. data/features/cassettes/cucumber_tags/new-files-for-sydney.yml +211 -0
  16. data/features/cassettes/cucumber_tags/new-files.yml +355 -0
  17. data/features/cassettes/cucumber_tags/no-new-or-changed-files.yml +359 -0
  18. data/features/cassettes/cucumber_tags/one-file-to-delete.yml +390 -0
  19. data/features/cassettes/cucumber_tags/only-changed-files.yml +411 -0
  20. data/features/cassettes/cucumber_tags/s3-and-cloudfront-when-updating-a-file.yml +435 -0
  21. data/features/cassettes/cucumber_tags/s3-and-cloudfront.yml +290 -0
  22. data/features/cloudfront.feature +35 -0
  23. data/features/delete.feature +18 -0
  24. data/features/instructions-for-new-user.feature +94 -0
  25. data/features/redirects.feature +16 -0
  26. data/features/step_definitions/steps.rb +67 -0
  27. data/features/support/env.rb +26 -0
  28. data/features/support/test_site_dirs/cdn-powered.blog.fi/_site/css/styles.css +3 -0
  29. data/features/support/test_site_dirs/cdn-powered.blog.fi/_site/index.html +5 -0
  30. data/features/support/test_site_dirs/cdn-powered.blog.fi/s3_website.yml +4 -0
  31. data/features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/_site/css/styles.css +3 -0
  32. data/features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/_site/index.html +10 -0
  33. data/features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/s3_website.yml +4 -0
  34. data/features/support/test_site_dirs/create-redirects/_site/.gitkeep +0 -0
  35. data/features/support/test_site_dirs/create-redirects/s3_website.yml +6 -0
  36. data/features/support/test_site_dirs/index-and-assets.blog.fi/_site/assets/picture.gif +0 -0
  37. data/features/support/test_site_dirs/index-and-assets.blog.fi/_site/css/styles.css +3 -0
  38. data/features/support/test_site_dirs/index-and-assets.blog.fi/_site/index.html +5 -0
  39. data/features/support/test_site_dirs/index-and-assets.blog.fi/s3_website.yml +3 -0
  40. data/features/support/test_site_dirs/my.blog.com/_site/css/styles.css +3 -0
  41. data/features/support/test_site_dirs/my.blog.com/_site/index.html +5 -0
  42. data/features/support/test_site_dirs/my.blog.com/s3_website.yml +3 -0
  43. data/features/support/test_site_dirs/my.sydney.blog.au/_site/css/styles.css +3 -0
  44. data/features/support/test_site_dirs/my.sydney.blog.au/_site/index.html +5 -0
  45. data/features/support/test_site_dirs/my.sydney.blog.au/s3_website.yml +4 -0
  46. data/features/support/test_site_dirs/new-and-changed-files.com/_site/css/styles.css +4 -0
  47. data/features/support/test_site_dirs/new-and-changed-files.com/_site/index.html +8 -0
  48. data/features/support/test_site_dirs/new-and-changed-files.com/s3_website.yml +3 -0
  49. data/features/support/test_site_dirs/no-new-or-changed-files.com/_site/css/styles.css +3 -0
  50. data/features/support/test_site_dirs/no-new-or-changed-files.com/_site/index.html +5 -0
  51. data/features/support/test_site_dirs/no-new-or-changed-files.com/s3_website.yml +3 -0
  52. data/features/support/test_site_dirs/only-changed-files.com/_site/css/styles.css +3 -0
  53. data/features/support/test_site_dirs/only-changed-files.com/_site/index.html +9 -0
  54. data/features/support/test_site_dirs/only-changed-files.com/s3_website.yml +3 -0
  55. data/features/support/test_site_dirs/site.with.css-maxage.com/_site/css/styles.css +3 -0
  56. data/features/support/test_site_dirs/site.with.css-maxage.com/_site/index.html +5 -0
  57. data/features/support/test_site_dirs/site.with.css-maxage.com/s3_website.yml +5 -0
  58. data/features/support/test_site_dirs/site.with.gzipped-and-max-aged-content.com/_site/css/styles.css +3 -0
  59. data/features/support/test_site_dirs/site.with.gzipped-and-max-aged-content.com/_site/index.html +5 -0
  60. data/features/support/test_site_dirs/site.with.gzipped-and-max-aged-content.com/s3_website.yml +5 -0
  61. data/features/support/test_site_dirs/site.with.gzipped-html.com/_site/css/styles.css +3 -0
  62. data/features/support/test_site_dirs/site.with.gzipped-html.com/_site/index.html +5 -0
  63. data/features/support/test_site_dirs/site.with.gzipped-html.com/s3_website.yml +5 -0
  64. data/features/support/test_site_dirs/site.with.maxage.com/_site/css/styles.css +3 -0
  65. data/features/support/test_site_dirs/site.with.maxage.com/_site/index.html +5 -0
  66. data/features/support/test_site_dirs/site.with.maxage.com/s3_website.yml +4 -0
  67. data/features/support/test_site_dirs/unpublish-a-post.com/_site/css/styles.css +3 -0
  68. data/features/support/test_site_dirs/unpublish-a-post.com/s3_website.yml +3 -0
  69. data/features/support/vcr.rb +18 -0
  70. data/features/sync.feature +80 -0
  71. data/features/website-performance.feature +57 -0
  72. data/lib/cloudfront/invalidator.rb +22 -0
  73. data/lib/s3_website.rb +20 -0
  74. data/lib/s3_website/config_loader.rb +56 -0
  75. data/lib/s3_website/diff_helper.rb +21 -0
  76. data/lib/s3_website/endpoint.rb +30 -0
  77. data/lib/s3_website/errors.rb +28 -0
  78. data/lib/s3_website/keyboard.rb +27 -0
  79. data/lib/s3_website/parallelism.rb +18 -0
  80. data/lib/s3_website/retry.rb +19 -0
  81. data/lib/s3_website/tasks.rb +42 -0
  82. data/lib/s3_website/upload.rb +103 -0
  83. data/lib/s3_website/uploader.rb +160 -0
  84. data/s3-website.gemspec +39 -0
  85. data/spec/lib/config_loader_spec.rb +20 -0
  86. data/spec/lib/endpoint_spec.rb +27 -0
  87. data/spec/lib/keyboard_spec.rb +59 -0
  88. data/spec/lib/parallelism_spec.rb +43 -0
  89. data/spec/lib/retry_spec.rb +34 -0
  90. data/spec/lib/upload_spec.rb +205 -0
  91. data/spec/lib/uploader_spec.rb +30 -0
  92. data/spec/sample_files/hyde_site/_site/.vimrc +5 -0
  93. data/spec/sample_files/hyde_site/_site/css/styles.css +3 -0
  94. data/spec/sample_files/hyde_site/_site/index.html +1 -0
  95. data/spec/sample_files/hyde_site/s3_website.yml +3 -0
  96. data/spec/sample_files/tokyo_site/_site/.vimrc +5 -0
  97. data/spec/sample_files/tokyo_site/_site/css/styles.css +3 -0
  98. data/spec/sample_files/tokyo_site/_site/index.html +1 -0
  99. data/spec/sample_files/tokyo_site/s3_website.yml +4 -0
  100. data/spec/spec_helper.rb +1 -0
  101. metadata +416 -0
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe S3Website::Parallelism do
4
+ context 'user has disabled parallelism' do
5
+ before(:all) {
6
+ @original_disable_state = ENV['disable_parallel_processing']
7
+ ENV['disable_parallel_processing'] = 'true'
8
+ }
9
+
10
+ after(:all) {
11
+ ENV['disable_parallel_processing'] = @original_disable_state
12
+ }
13
+
14
+ it 'runs things sequentially' do
15
+ ints = (0..100).to_a
16
+ after_processing = []
17
+ S3Website::Parallelism.each_in_parallel_or_sequentially(ints) { |int|
18
+ after_processing << int
19
+ }
20
+ ints.should eq(after_processing)
21
+ end
22
+ end
23
+
24
+ context 'user has not disabled parallelism' do
25
+ before(:all) {
26
+ @original_disable_state = ENV['disable_parallel_processing']
27
+ ENV.delete 'disable_parallel_processing'
28
+ }
29
+
30
+ after(:all) {
31
+ ENV['disable_parallel_processing'] = @original_disable_state if @original_disable_state
32
+ }
33
+
34
+ it 'runs things in parallel' do
35
+ ints = (0..100).to_a
36
+ after_processing = []
37
+ S3Website::Parallelism.each_in_parallel_or_sequentially(ints) { |int|
38
+ after_processing << int
39
+ }
40
+ ints.should_not eq(after_processing) # Parallel processing introduces non-determinism
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe S3Website::Retry do
4
+ describe ".run_with_retry" do
5
+ it "retry the operation 4 times" do
6
+ retries = 0
7
+ begin
8
+ S3Website::Retry.run_with_retry(0.001) {
9
+ retries += 1
10
+ raise Exception
11
+ }
12
+ rescue
13
+ end
14
+ retries.should be(4)
15
+ end
16
+
17
+ it "throws an error if all retries fail" do
18
+ expect {
19
+ S3Website::Retry.run_with_retry(0.001) {
20
+ raise Exception
21
+ }
22
+ }.to raise_error(S3Website::RetryAttemptsExhaustedError)
23
+ end
24
+
25
+ it "re-runs the block if the block throws an error" do
26
+ retries = 0
27
+ S3Website::Retry.run_with_retry(0.001) {
28
+ retries += 1
29
+ raise Exception if retries < 2
30
+ }
31
+ retries.should be(2)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,205 @@
1
+ require 'spec_helper'
2
+
3
+ describe S3Website::Upload do
4
+ describe 'reduced redundancy setting' do
5
+ let(:config) {
6
+ { 's3_reduced_redundancy' => true }
7
+ }
8
+
9
+ it 'allows storing a file under the Reduced Redundancy Storage' do
10
+ file_to_upload = 'index.html'
11
+ s3_client = create_verifying_s3_client(file_to_upload) do |s3_object|
12
+ s3_object.should_receive(:write).with(
13
+ anything(),
14
+ :content_type => 'text/html; charset=utf-8',
15
+ :reduced_redundancy => true
16
+ )
17
+ end
18
+ S3Website::Upload.new(file_to_upload,
19
+ s3_client,
20
+ config,
21
+ 'features/support/test_site_dirs/my.blog.com/_site').perform!
22
+ end
23
+ end
24
+
25
+ describe 'content type resolving' do
26
+ let(:config) {
27
+ { 's3_reduced_redundancy' => false }
28
+ }
29
+
30
+ it 'adds the content type of the uploaded CSS file into the S3 object' do
31
+ file_to_upload = 'css/styles.css'
32
+ s3_client = create_verifying_s3_client(file_to_upload) do |s3_object|
33
+ s3_object.should_receive(:write).with(
34
+ anything(),
35
+ :content_type => 'text/css',
36
+ :reduced_redundancy => false
37
+ )
38
+ end
39
+ S3Website::Upload.new(file_to_upload,
40
+ s3_client,
41
+ config,
42
+ 'features/support/test_site_dirs/my.blog.com/_site').perform!
43
+ end
44
+
45
+ it 'adds the content type of the uploaded HTML file into the S3 object' do
46
+ file_to_upload = 'index.html'
47
+ s3_client = create_verifying_s3_client(file_to_upload) do |s3_object|
48
+ s3_object.should_receive(:write).with(
49
+ anything(),
50
+ :content_type => 'text/html; charset=utf-8',
51
+ :reduced_redundancy => false
52
+ )
53
+ end
54
+ S3Website::Upload.new(file_to_upload,
55
+ s3_client,
56
+ config,
57
+ 'features/support/test_site_dirs/my.blog.com/_site').perform!
58
+ end
59
+ end
60
+
61
+ describe 'gzip compression' do
62
+ let(:config){
63
+ {
64
+ 's3_reduced_redundancy' => false,
65
+ 'gzip' => true
66
+ }
67
+ }
68
+
69
+ subject{ S3Website::Upload.new("index.html", mock(), config, 'features/support/test_site_dirs/my.blog.com/_site') }
70
+
71
+ describe '#gzip?' do
72
+ it 'should be false if the config does not specify gzip' do
73
+ config.delete 'gzip'
74
+ subject.should_not be_gzip
75
+ end
76
+
77
+ it 'should be false if gzip is true but does not match a default extension' do
78
+ subject.stub(:path).and_return("index.bork")
79
+ subject.should_not be_gzip
80
+ end
81
+
82
+ it 'should be true if gzip is true and file extension matches' do
83
+ subject.should be_gzip
84
+ end
85
+
86
+ it 'should be true if gzip is true and file extension matches custom supplied' do
87
+ config['gzip'] = %w(.bork)
88
+ subject.stub(:path).and_return('index.bork')
89
+ subject.should be_gzip
90
+ end
91
+ end
92
+
93
+ describe '#gzipped_file' do
94
+ it 'should return a gzipped version of the file' do
95
+ gz = Zlib::GzipReader.new(subject.send(:gzipped_file))
96
+ gz.read.should == File.read('features/support/test_site_dirs/my.blog.com/_site/index.html')
97
+ end
98
+ end
99
+ end
100
+
101
+ describe 'cache control' do
102
+ let(:config){
103
+ {
104
+ 's3_reduced_redundancy' => false,
105
+ 'max_age' => 300
106
+ }
107
+ }
108
+
109
+ let(:subject) {
110
+ S3Website::Upload.new(
111
+ "index.html",
112
+ mock(),
113
+ config,
114
+ 'features/support/test_site_dirs/my.blog.com/_site'
115
+ )
116
+ }
117
+
118
+ describe '#cache_control?' do
119
+ it 'should be false if max_age is missing' do
120
+ config.delete 'max_age'
121
+ subject.should_not be_cache_control
122
+ end
123
+
124
+ it 'should be true if max_age is present' do
125
+ subject.should be_cache_control
126
+ end
127
+
128
+ it 'should be true if max_age is a hash' do
129
+ config['max_age'] = {'*' => 300}
130
+ subject.should be_cache_control
131
+ end
132
+ end
133
+
134
+ describe '#max_age' do
135
+ it 'should be the universal value if one is set' do
136
+ subject.send(:max_age).should == 300
137
+ end
138
+
139
+ it 'should be the file-specific value if one is set' do
140
+ config['max_age'] = {'*index.html' => 500}
141
+ subject.send(:max_age).should == 500
142
+ end
143
+
144
+ it 'should be zero if no file-specific value hit' do
145
+ config['max_age'] = {'*.js' => 500}
146
+ subject.send(:max_age).should == 0
147
+ end
148
+
149
+ context 'overriding the more general setting with the more specific' do
150
+ let(:config){
151
+ {
152
+ 's3_reduced_redundancy' => false,
153
+ 'max_age' => {
154
+ '**' => 150,
155
+ 'assets/**' => 86400
156
+ }
157
+ }
158
+ }
159
+
160
+ it 'respects the most specific max-age selector' do
161
+ subject = S3Website::Upload.new(
162
+ 'assets/picture.gif',
163
+ mock(),
164
+ config,
165
+ 'features/support/test_site_dirs/index-and-assets.blog.fi/_site'
166
+ )
167
+ subject.send(:max_age).should == 86400
168
+ end
169
+
170
+ it 'respects the most specific max-age selector' do
171
+ subject = S3Website::Upload.new(
172
+ 'index.html',
173
+ mock(),
174
+ config,
175
+ 'features/support/test_site_dirs/index-and-assets.blog.fi/_site'
176
+ )
177
+ subject.send(:max_age).should == 150
178
+ end
179
+ end
180
+ end
181
+ end
182
+
183
+ def create_verifying_s3_client(file_to_upload, &block)
184
+ def create_objects(file_to_upload, &block)
185
+ def create_html_s3_object(file_to_upload, &block)
186
+ s3_object = stub('s3_object')
187
+ yield s3_object
188
+ s3_object
189
+ end
190
+ objects = {}
191
+ objects[file_to_upload] = create_html_s3_object(file_to_upload, &block)
192
+ objects
193
+ end
194
+ def create_bucket(file_to_upload, &block)
195
+ bucket = stub('bucket')
196
+ bucket.stub(:objects => create_objects(file_to_upload, &block))
197
+ bucket
198
+ end
199
+ buckets = stub('buckets')
200
+ buckets.stub(:[] => create_bucket(file_to_upload, &block))
201
+ s3 = stub('s3')
202
+ s3.stub(:buckets => buckets)
203
+ s3
204
+ end
205
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe S3Website::Uploader do
4
+ context '#load_all_local_files' do
5
+ let(:files) {
6
+ S3Website::Uploader.send(:load_all_local_files,
7
+ 'spec/sample_files/hyde_site/_site')
8
+ }
9
+
10
+ it 'loads regular files' do
11
+ files.should include('css/styles.css')
12
+ files.should include('index.html')
13
+ end
14
+
15
+ it 'loads also dotfiles' do
16
+ files.should include('.vimrc')
17
+ end
18
+ end
19
+
20
+ context "#build_list_of_files_to_delete" do
21
+ it "ignores files which match a regular expression" do
22
+ files_to_delete = S3Website::Uploader.build_list_of_files_to_delete(["a", "b", "ignored"], ["a"], "ignored")
23
+ files_to_delete.should eq ["b"]
24
+ end
25
+ it "does not ignore when you don't provide an ignored regex" do
26
+ files_to_delete = S3Website::Uploader.build_list_of_files_to_delete(["a", "b", "ignored"], ["a"])
27
+ files_to_delete.should eq ["b", "ignored"]
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,5 @@
1
+ " Disable the arrow keys in the normal mode – using them there only slows you down. Use hkjl instead.
2
+ map <Left> :echo "no!"<cr>
3
+ map <Right> :echo "no!"<cr>
4
+ map <Up> :echo "no!"<cr>
5
+ map <Down> :echo "no!"<cr>
@@ -0,0 +1,3 @@
1
+ body {
2
+
3
+ }
@@ -0,0 +1 @@
1
+ <div>Hello world</div>
@@ -0,0 +1,3 @@
1
+ s3_id: <%= 'hello' %>
2
+ s3_secret: <%= 'world' %>
3
+ s3_bucket: galaxy
@@ -0,0 +1,5 @@
1
+ " Disable the arrow keys in the normal mode – using them there only slows you down. Use hkjl instead.
2
+ map <Left> :echo "no!"<cr>
3
+ map <Right> :echo "no!"<cr>
4
+ map <Up> :echo "no!"<cr>
5
+ map <Down> :echo "no!"<cr>
@@ -0,0 +1,3 @@
1
+ body {
2
+
3
+ }
@@ -0,0 +1 @@
1
+ <div>Hello world</div>
@@ -0,0 +1,4 @@
1
+ s3_id: <%= 'hello' %>
2
+ s3_secret: <%= 'world' %>
3
+ s3_bucket: galaxy
4
+ s3_endpoint: ap-northeast-1
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__) + "/../lib/s3_website.rb"
metadata ADDED
@@ -0,0 +1,416 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: s3_website
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Lauri Lehmijoki
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-06-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 1.8.5
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 1.8.5
27
+ - !ruby/object:Gem::Dependency
28
+ name: filey-diff
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: simple-cloudfront-invalidator
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: erubis
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 2.7.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 2.7.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: mime-types
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: '1.19'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: '1.19'
83
+ - !ruby/object:Gem::Dependency
84
+ name: thor
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 0.18.1
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 0.18.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: configure-s3-website
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: '1'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: '1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec-expectations
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: cucumber
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: aruba
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ~>
158
+ - !ruby/object:Gem::Version
159
+ version: 0.5.1
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ~>
165
+ - !ruby/object:Gem::Version
166
+ version: 0.5.1
167
+ - !ruby/object:Gem::Dependency
168
+ name: rake
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '>='
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: vcr
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ~>
186
+ - !ruby/object:Gem::Version
187
+ version: 2.5.0
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ~>
193
+ - !ruby/object:Gem::Version
194
+ version: 2.5.0
195
+ - !ruby/object:Gem::Dependency
196
+ name: webmock
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ~>
200
+ - !ruby/object:Gem::Version
201
+ version: 1.8.0
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ~>
207
+ - !ruby/object:Gem::Version
208
+ version: 1.8.0
209
+ description: "\n Sync website files, set redirects, use HTTP performance optimisations,
210
+ deliver via\n CloudFront.\n "
211
+ email:
212
+ - lauri.lehmijoki@iki.fi
213
+ executables:
214
+ - s3_website
215
+ extensions: []
216
+ extra_rdoc_files: []
217
+ files:
218
+ - .gitignore
219
+ - .travis.yml
220
+ - Gemfile
221
+ - Gemfile.lock
222
+ - LICENSE
223
+ - README.md
224
+ - Rakefile
225
+ - bin/s3_website
226
+ - changelog.md
227
+ - example-configurations.md
228
+ - features/as-library.feature
229
+ - features/cassettes/cucumber_tags/create-redirect.yml
230
+ - features/cassettes/cucumber_tags/new-and-changed-files.yml
231
+ - features/cassettes/cucumber_tags/new-files-for-sydney.yml
232
+ - features/cassettes/cucumber_tags/new-files.yml
233
+ - features/cassettes/cucumber_tags/no-new-or-changed-files.yml
234
+ - features/cassettes/cucumber_tags/one-file-to-delete.yml
235
+ - features/cassettes/cucumber_tags/only-changed-files.yml
236
+ - features/cassettes/cucumber_tags/s3-and-cloudfront-when-updating-a-file.yml
237
+ - features/cassettes/cucumber_tags/s3-and-cloudfront.yml
238
+ - features/cloudfront.feature
239
+ - features/delete.feature
240
+ - features/instructions-for-new-user.feature
241
+ - features/redirects.feature
242
+ - features/step_definitions/steps.rb
243
+ - features/support/env.rb
244
+ - features/support/test_site_dirs/cdn-powered.blog.fi/_site/css/styles.css
245
+ - features/support/test_site_dirs/cdn-powered.blog.fi/_site/index.html
246
+ - features/support/test_site_dirs/cdn-powered.blog.fi/s3_website.yml
247
+ - features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/_site/css/styles.css
248
+ - features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/_site/index.html
249
+ - features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/s3_website.yml
250
+ - features/support/test_site_dirs/create-redirects/_site/.gitkeep
251
+ - features/support/test_site_dirs/create-redirects/s3_website.yml
252
+ - features/support/test_site_dirs/index-and-assets.blog.fi/_site/assets/picture.gif
253
+ - features/support/test_site_dirs/index-and-assets.blog.fi/_site/css/styles.css
254
+ - features/support/test_site_dirs/index-and-assets.blog.fi/_site/index.html
255
+ - features/support/test_site_dirs/index-and-assets.blog.fi/s3_website.yml
256
+ - features/support/test_site_dirs/my.blog.com/_site/css/styles.css
257
+ - features/support/test_site_dirs/my.blog.com/_site/index.html
258
+ - features/support/test_site_dirs/my.blog.com/s3_website.yml
259
+ - features/support/test_site_dirs/my.sydney.blog.au/_site/css/styles.css
260
+ - features/support/test_site_dirs/my.sydney.blog.au/_site/index.html
261
+ - features/support/test_site_dirs/my.sydney.blog.au/s3_website.yml
262
+ - features/support/test_site_dirs/new-and-changed-files.com/_site/css/styles.css
263
+ - features/support/test_site_dirs/new-and-changed-files.com/_site/index.html
264
+ - features/support/test_site_dirs/new-and-changed-files.com/s3_website.yml
265
+ - features/support/test_site_dirs/no-new-or-changed-files.com/_site/css/styles.css
266
+ - features/support/test_site_dirs/no-new-or-changed-files.com/_site/index.html
267
+ - features/support/test_site_dirs/no-new-or-changed-files.com/s3_website.yml
268
+ - features/support/test_site_dirs/only-changed-files.com/_site/css/styles.css
269
+ - features/support/test_site_dirs/only-changed-files.com/_site/index.html
270
+ - features/support/test_site_dirs/only-changed-files.com/s3_website.yml
271
+ - features/support/test_site_dirs/site.with.css-maxage.com/_site/css/styles.css
272
+ - features/support/test_site_dirs/site.with.css-maxage.com/_site/index.html
273
+ - features/support/test_site_dirs/site.with.css-maxage.com/s3_website.yml
274
+ - features/support/test_site_dirs/site.with.gzipped-and-max-aged-content.com/_site/css/styles.css
275
+ - features/support/test_site_dirs/site.with.gzipped-and-max-aged-content.com/_site/index.html
276
+ - features/support/test_site_dirs/site.with.gzipped-and-max-aged-content.com/s3_website.yml
277
+ - features/support/test_site_dirs/site.with.gzipped-html.com/_site/css/styles.css
278
+ - features/support/test_site_dirs/site.with.gzipped-html.com/_site/index.html
279
+ - features/support/test_site_dirs/site.with.gzipped-html.com/s3_website.yml
280
+ - features/support/test_site_dirs/site.with.maxage.com/_site/css/styles.css
281
+ - features/support/test_site_dirs/site.with.maxage.com/_site/index.html
282
+ - features/support/test_site_dirs/site.with.maxage.com/s3_website.yml
283
+ - features/support/test_site_dirs/unpublish-a-post.com/_site/css/styles.css
284
+ - features/support/test_site_dirs/unpublish-a-post.com/s3_website.yml
285
+ - features/support/vcr.rb
286
+ - features/sync.feature
287
+ - features/website-performance.feature
288
+ - lib/cloudfront/invalidator.rb
289
+ - lib/s3_website.rb
290
+ - lib/s3_website/config_loader.rb
291
+ - lib/s3_website/diff_helper.rb
292
+ - lib/s3_website/endpoint.rb
293
+ - lib/s3_website/errors.rb
294
+ - lib/s3_website/keyboard.rb
295
+ - lib/s3_website/parallelism.rb
296
+ - lib/s3_website/retry.rb
297
+ - lib/s3_website/tasks.rb
298
+ - lib/s3_website/upload.rb
299
+ - lib/s3_website/uploader.rb
300
+ - s3-website.gemspec
301
+ - spec/lib/config_loader_spec.rb
302
+ - spec/lib/endpoint_spec.rb
303
+ - spec/lib/keyboard_spec.rb
304
+ - spec/lib/parallelism_spec.rb
305
+ - spec/lib/retry_spec.rb
306
+ - spec/lib/upload_spec.rb
307
+ - spec/lib/uploader_spec.rb
308
+ - spec/sample_files/hyde_site/_site/.vimrc
309
+ - spec/sample_files/hyde_site/_site/css/styles.css
310
+ - spec/sample_files/hyde_site/_site/index.html
311
+ - spec/sample_files/hyde_site/s3_website.yml
312
+ - spec/sample_files/tokyo_site/_site/.vimrc
313
+ - spec/sample_files/tokyo_site/_site/css/styles.css
314
+ - spec/sample_files/tokyo_site/_site/index.html
315
+ - spec/sample_files/tokyo_site/s3_website.yml
316
+ - spec/spec_helper.rb
317
+ homepage: https://github.com/laurilehmijoki/s3_website
318
+ licenses: []
319
+ metadata: {}
320
+ post_install_message:
321
+ rdoc_options: []
322
+ require_paths:
323
+ - lib
324
+ required_ruby_version: !ruby/object:Gem::Requirement
325
+ requirements:
326
+ - - '>='
327
+ - !ruby/object:Gem::Version
328
+ version: '0'
329
+ required_rubygems_version: !ruby/object:Gem::Requirement
330
+ requirements:
331
+ - - '>='
332
+ - !ruby/object:Gem::Version
333
+ version: '0'
334
+ requirements: []
335
+ rubyforge_project:
336
+ rubygems_version: 2.0.3
337
+ signing_key:
338
+ specification_version: 4
339
+ summary: Manage your S3 website
340
+ test_files:
341
+ - features/as-library.feature
342
+ - features/cassettes/cucumber_tags/create-redirect.yml
343
+ - features/cassettes/cucumber_tags/new-and-changed-files.yml
344
+ - features/cassettes/cucumber_tags/new-files-for-sydney.yml
345
+ - features/cassettes/cucumber_tags/new-files.yml
346
+ - features/cassettes/cucumber_tags/no-new-or-changed-files.yml
347
+ - features/cassettes/cucumber_tags/one-file-to-delete.yml
348
+ - features/cassettes/cucumber_tags/only-changed-files.yml
349
+ - features/cassettes/cucumber_tags/s3-and-cloudfront-when-updating-a-file.yml
350
+ - features/cassettes/cucumber_tags/s3-and-cloudfront.yml
351
+ - features/cloudfront.feature
352
+ - features/delete.feature
353
+ - features/instructions-for-new-user.feature
354
+ - features/redirects.feature
355
+ - features/step_definitions/steps.rb
356
+ - features/support/env.rb
357
+ - features/support/test_site_dirs/cdn-powered.blog.fi/_site/css/styles.css
358
+ - features/support/test_site_dirs/cdn-powered.blog.fi/_site/index.html
359
+ - features/support/test_site_dirs/cdn-powered.blog.fi/s3_website.yml
360
+ - features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/_site/css/styles.css
361
+ - features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/_site/index.html
362
+ - features/support/test_site_dirs/cdn-powered.with-one-change.blog.fi/s3_website.yml
363
+ - features/support/test_site_dirs/create-redirects/_site/.gitkeep
364
+ - features/support/test_site_dirs/create-redirects/s3_website.yml
365
+ - features/support/test_site_dirs/index-and-assets.blog.fi/_site/assets/picture.gif
366
+ - features/support/test_site_dirs/index-and-assets.blog.fi/_site/css/styles.css
367
+ - features/support/test_site_dirs/index-and-assets.blog.fi/_site/index.html
368
+ - features/support/test_site_dirs/index-and-assets.blog.fi/s3_website.yml
369
+ - features/support/test_site_dirs/my.blog.com/_site/css/styles.css
370
+ - features/support/test_site_dirs/my.blog.com/_site/index.html
371
+ - features/support/test_site_dirs/my.blog.com/s3_website.yml
372
+ - features/support/test_site_dirs/my.sydney.blog.au/_site/css/styles.css
373
+ - features/support/test_site_dirs/my.sydney.blog.au/_site/index.html
374
+ - features/support/test_site_dirs/my.sydney.blog.au/s3_website.yml
375
+ - features/support/test_site_dirs/new-and-changed-files.com/_site/css/styles.css
376
+ - features/support/test_site_dirs/new-and-changed-files.com/_site/index.html
377
+ - features/support/test_site_dirs/new-and-changed-files.com/s3_website.yml
378
+ - features/support/test_site_dirs/no-new-or-changed-files.com/_site/css/styles.css
379
+ - features/support/test_site_dirs/no-new-or-changed-files.com/_site/index.html
380
+ - features/support/test_site_dirs/no-new-or-changed-files.com/s3_website.yml
381
+ - features/support/test_site_dirs/only-changed-files.com/_site/css/styles.css
382
+ - features/support/test_site_dirs/only-changed-files.com/_site/index.html
383
+ - features/support/test_site_dirs/only-changed-files.com/s3_website.yml
384
+ - features/support/test_site_dirs/site.with.css-maxage.com/_site/css/styles.css
385
+ - features/support/test_site_dirs/site.with.css-maxage.com/_site/index.html
386
+ - features/support/test_site_dirs/site.with.css-maxage.com/s3_website.yml
387
+ - features/support/test_site_dirs/site.with.gzipped-and-max-aged-content.com/_site/css/styles.css
388
+ - features/support/test_site_dirs/site.with.gzipped-and-max-aged-content.com/_site/index.html
389
+ - features/support/test_site_dirs/site.with.gzipped-and-max-aged-content.com/s3_website.yml
390
+ - features/support/test_site_dirs/site.with.gzipped-html.com/_site/css/styles.css
391
+ - features/support/test_site_dirs/site.with.gzipped-html.com/_site/index.html
392
+ - features/support/test_site_dirs/site.with.gzipped-html.com/s3_website.yml
393
+ - features/support/test_site_dirs/site.with.maxage.com/_site/css/styles.css
394
+ - features/support/test_site_dirs/site.with.maxage.com/_site/index.html
395
+ - features/support/test_site_dirs/site.with.maxage.com/s3_website.yml
396
+ - features/support/test_site_dirs/unpublish-a-post.com/_site/css/styles.css
397
+ - features/support/test_site_dirs/unpublish-a-post.com/s3_website.yml
398
+ - features/support/vcr.rb
399
+ - features/sync.feature
400
+ - features/website-performance.feature
401
+ - spec/lib/config_loader_spec.rb
402
+ - spec/lib/endpoint_spec.rb
403
+ - spec/lib/keyboard_spec.rb
404
+ - spec/lib/parallelism_spec.rb
405
+ - spec/lib/retry_spec.rb
406
+ - spec/lib/upload_spec.rb
407
+ - spec/lib/uploader_spec.rb
408
+ - spec/sample_files/hyde_site/_site/.vimrc
409
+ - spec/sample_files/hyde_site/_site/css/styles.css
410
+ - spec/sample_files/hyde_site/_site/index.html
411
+ - spec/sample_files/hyde_site/s3_website.yml
412
+ - spec/sample_files/tokyo_site/_site/.vimrc
413
+ - spec/sample_files/tokyo_site/_site/css/styles.css
414
+ - spec/sample_files/tokyo_site/_site/index.html
415
+ - spec/sample_files/tokyo_site/s3_website.yml
416
+ - spec/spec_helper.rb