jekyll-s3 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -18,30 +18,28 @@ Deploy your jekyll site to S3.
18
18
 
19
19
  ## Setup
20
20
 
21
- * Go to your jekyll site directory
22
- * Run `jekyll-s3`. It generates a configuration file called `_jekyll_s3.yml` that looks like that:
21
+ * Go to your jekyll site directory
22
+ * Run `jekyll-s3`. It generates a configuration file called `_jekyll_s3.yml` that looks like this:
23
23
  <pre>
24
24
  s3_id: YOUR_AWS_S3_ACCESS_KEY_ID
25
25
  s3_secret: YOUR_AWS_S3_SECRET_ACCESS_KEY
26
26
  s3_bucket: your.blog.bucket.com
27
- cloudfront_distribution_id: YOUR_CLOUDFRONT_DIST_ID (OPTIONAL)
28
27
  </pre>
29
28
 
30
- * Edit it with your details.
31
- * Hint: you can use ERB syntax in `_jekyll_s3.yml`. This is handy, if you
32
- want to store the AWS credentials as environmental variables.
29
+ * Edit it with your details (you can use [ERB](http://ruby-doc.org/stdlib-1.9.3/libdoc/erb/rdoc/ERB.html) in the file)
30
+ * [Configure your S3 bucket to function like a website](http://docs.amazonwebservices.com/AmazonS3/latest/dev/HostingWebsiteOnS3Setup.html)
33
31
 
34
32
  ## Deploy!
35
33
 
36
34
  * Run `jekyll-s3`. Done.
37
35
 
38
- ## Want the root url to render index.html?
36
+ ## Reduced Redundancy
39
37
 
40
- * Log into <https://console.aws.amazon.com/s3/home>
41
- * Set the Index document to index.html in Bucket Properties >
42
- Website.
43
- * Visit the website endpoint:
44
- (http://yourblog.s3-website...amazonaws.com)
38
+ You can reduce the cost of hosting your blog on S3 by using Reduced Redundancy Storage:
39
+
40
+ * In `_jekyll_s3.yml`, set `s3_reduced_redundancy: true`
41
+ * All objects uploaded after this change will use the Reduced Redundancy Storage.
42
+ * If you want to change all of the files in the bucket, you can change them through the AWS console, or update the timestamp on the files before running `jekyll-s3` again
45
43
 
46
44
  ## How to use Cloudfront to deliver your blog
47
45
 
@@ -68,6 +66,10 @@ Enable the headless mode by adding the `--headless` or `-h` argument after
68
66
 
69
67
  ## Changelog
70
68
 
69
+ ### 2.1.0
70
+
71
+ * Added support for S3 reduced redundancy storage
72
+
71
73
  ### 2.0.0
72
74
 
73
75
  * Set content type of the uploaded files
@@ -120,3 +122,4 @@ Contributors (in alphabetical order)
120
122
  * Chris Kelly
121
123
  * Chris Moos
122
124
  * Lauri Lehmijoki
125
+ * Mason Turner
@@ -21,6 +21,7 @@ Feature: Command-line interface feedback
21
21
  s3_id: YOUR_AWS_S3_ACCESS_KEY_ID
22
22
  s3_secret: YOUR_AWS_S3_SECRET_ACCESS_KEY
23
23
  s3_bucket: your.blog.bucket.com
24
+ s3_reduced_redundancy: false
24
25
  cloudfront_distribution_id: YOUR_CLOUDFRONT_DIST_ID (OPTIONAL)
25
26
  """
26
27
 
@@ -34,6 +35,7 @@ Feature: Command-line interface feedback
34
35
  s3_id: YOUR_AWS_S3_ACCESS_KEY_ID
35
36
  s3_secret: YOUR_AWS_S3_SECRET_ACCESS_KEY
36
37
  s3_bucket: your.blog.bucket.com
38
+ s3_reduced_redundancy: false
37
39
  """
38
40
 
39
41
  Scenario: Run jekyll-s3 with a malformed configuration file
@@ -50,6 +52,7 @@ Feature: Command-line interface feedback
50
52
  s3_id: YOUR_AWS_S3_ACCESS_KEY_ID
51
53
  s3_secret: YOUR_AWS_S3_SECRET_ACCESS_KEY
52
54
  s3_bucket: your.blog.bucket.com
55
+ s3_reduced_redundancy: false
53
56
  """
54
57
 
55
58
  Scenario: Run jekyll-s3 with a configuration file that does not contain a bucket
@@ -59,6 +62,7 @@ Feature: Command-line interface feedback
59
62
  s3_id: YOUR_AWS_S3_ACCESS_KEY_ID
60
63
  s3_secret: YOUR_AWS_S3_SECRET_ACCESS_KEY
61
64
  s3_bucket:
65
+ s3_reduced_redundancy: false
62
66
  """
63
67
  When I run `jekyll-s3`
64
68
  Then the output should contain:
@@ -67,6 +71,7 @@ Feature: Command-line interface feedback
67
71
  s3_id: YOUR_AWS_S3_ACCESS_KEY_ID
68
72
  s3_secret: YOUR_AWS_S3_SECRET_ACCESS_KEY
69
73
  s3_bucket: your.blog.bucket.com
74
+ s3_reduced_redundancy: false
70
75
  """
71
76
 
72
77
  Scenario: Run jekyll-s3
@@ -10,6 +10,7 @@ require 'cucumber/rspec/doubles'
10
10
  Before do
11
11
  @__aruba_original_paths = (ENV['PATH'] || '').split(File::PATH_SEPARATOR)
12
12
  ENV['PATH'] = ([File.expand_path('bin')] + @__aruba_original_paths).join(File::PATH_SEPARATOR)
13
+ @aruba_timeout_seconds = 5
13
14
  end
14
15
 
15
16
  After do
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "jekyll-s3"
6
- s.version = "2.0.0"
6
+ s.version = "2.1.0"
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ["Philippe Creux", "Lauri Lehmijoki"]
9
9
  s.email = ["pcreux@gmail.com", "lauri.lehmijoki@iki.fi"]
@@ -15,7 +15,7 @@ distribution, making it easy to deliver your blog via the CDN.}
15
15
 
16
16
  s.default_executable = %q{jekyll-s3}
17
17
 
18
- s.add_dependency 'aws-sdk', '~> 1.5.6'
18
+ s.add_dependency 'aws-sdk', '~> 1.8.0'
19
19
  s.add_dependency 'filey-diff', '~> 0.0.2'
20
20
  s.add_dependency 'simple-cloudfront-invalidator', '~> 1.0.0'
21
21
  s.add_dependency 'erubis', '~> 2.7.0'
@@ -6,6 +6,7 @@ module Jekyll
6
6
  s3_id: YOUR_AWS_S3_ACCESS_KEY_ID
7
7
  s3_secret: YOUR_AWS_S3_SECRET_ACCESS_KEY
8
8
  s3_bucket: your.blog.bucket.com
9
+ s3_reduced_redundancy: false
9
10
  cloudfront_distribution_id: YOUR_CLOUDFRONT_DIST_ID (OPTIONAL)
10
11
  EOF
11
12
 
@@ -2,22 +2,21 @@ module Jekyll
2
2
  module S3
3
3
  class Uploader
4
4
  def self.run(site_dir, config, in_headless_mode = false)
5
- s3_id = config['s3_id']
6
- s3_secret = config['s3_secret']
7
- s3_bucket_name = config['s3_bucket']
8
- puts "Deploying _site/* to #{s3_bucket_name}"
5
+ puts "Deploying _site/* to #{config['s3_bucket']}"
9
6
 
10
- s3 = AWS::S3.new(:access_key_id => s3_id,
11
- :secret_access_key => s3_secret)
7
+ s3 = AWS::S3.new(:access_key_id => config['s3_id'],
8
+ :secret_access_key => config['s3_secret'])
12
9
 
13
- create_bucket_if_needed(s3, s3_bucket_name)
10
+ create_bucket_if_needed(s3, config['s3_bucket'])
14
11
 
15
- new_files_count, changed_files_count, changed_files = upload_files(s3, s3_bucket_name, site_dir)
12
+ new_files_count, changed_files_count, changed_files = upload_files(
13
+ s3, config, site_dir
14
+ )
16
15
 
17
16
  deleted_files_count = remove_superfluous_files(
18
- s3, s3_bucket_name, site_dir, in_headless_mode)
17
+ s3, config['s3_bucket'], site_dir, in_headless_mode)
19
18
 
20
- puts "Done! Go visit: http://#{s3_bucket_name}.s3.amazonaws.com/index.html"
19
+ puts "Done! Go visit: http://#{config['s3_bucket']}.s3.amazonaws.com/index.html"
21
20
  [new_files_count, changed_files_count, deleted_files_count, changed_files]
22
21
  end
23
22
 
@@ -30,9 +29,9 @@ module Jekyll
30
29
  end
31
30
  end
32
31
 
33
- def self.upload_files(s3, s3_bucket_name, site_dir)
32
+ def self.upload_files(s3, config, site_dir)
34
33
  changed_files, new_files = DiffHelper.resolve_files_to_upload(
35
- s3.buckets[s3_bucket_name], site_dir)
34
+ s3.buckets[config['s3_bucket']], site_dir)
36
35
  to_upload = changed_files + new_files
37
36
  if to_upload.empty?
38
37
  puts "No new or changed files to upload"
@@ -45,18 +44,19 @@ module Jekyll
45
44
  pre_upload_report << "file(s)"
46
45
  puts pre_upload_report.join(' ')
47
46
  to_upload.each do |f|
48
- upload_file(f, s3, s3_bucket_name, site_dir)
47
+ upload_file(f, s3, config, site_dir)
49
48
  end
50
49
  end
51
50
  [new_files.length, changed_files.length, changed_files]
52
51
  end
53
52
 
54
- def self.upload_file(file, s3, s3_bucket_name, site_dir)
53
+ def self.upload_file(file, s3, config, site_dir)
55
54
  Retry.run_with_retry do
56
55
  mime_type = MIME::Types.type_for(file)
57
- upload_succeeded = s3.buckets[s3_bucket_name].objects[file].write(
56
+ upload_succeeded = s3.buckets[config['s3_bucket']].objects[file].write(
58
57
  File.read("#{site_dir}/#{file}"),
59
- :content_type => mime_type.first
58
+ :content_type => mime_type.first ,
59
+ :reduced_redundancy => config['s3_reduced_redundancy'],
60
60
  )
61
61
  if upload_succeeded
62
62
  puts("Upload #{file}: Success!")
@@ -1,51 +1,86 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Jekyll::S3::Uploader 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',
15
+ :reduced_redundancy => true
16
+ )
17
+ end
18
+ Jekyll::S3::Uploader.send(:upload_file,
19
+ file_to_upload,
20
+ s3_client,
21
+ config,
22
+ 'features/support/test_site_dirs/my.blog.com/_site')
23
+ end
24
+ end
25
+
4
26
  describe 'content type resolving' do
27
+ let(:config) {
28
+ { 's3_reduced_redundancy' => false }
29
+ }
30
+
5
31
  it 'adds the content type of the uploaded CSS file into the S3 object' do
6
32
  file_to_upload = 'css/styles.css'
33
+ s3_client = create_verifying_s3_client(file_to_upload) do |s3_object|
34
+ s3_object.should_receive(:write).with(
35
+ anything(),
36
+ :content_type => 'text/css',
37
+ :reduced_redundancy => false
38
+ )
39
+ end
7
40
  Jekyll::S3::Uploader.send(:upload_file,
8
41
  file_to_upload,
9
- create_content_type_verifying_s3(file_to_upload),
10
- 'some_bucket_name',
42
+ s3_client,
43
+ config,
11
44
  'features/support/test_site_dirs/my.blog.com/_site')
12
45
  end
13
46
 
14
47
  it 'adds the content type of the uploaded HTML file into the S3 object' do
15
48
  file_to_upload = 'index.html'
49
+ s3_client = create_verifying_s3_client(file_to_upload) do |s3_object|
50
+ s3_object.should_receive(:write).with(
51
+ anything(),
52
+ :content_type => 'text/html',
53
+ :reduced_redundancy => false
54
+ )
55
+ end
16
56
  Jekyll::S3::Uploader.send(:upload_file,
17
57
  file_to_upload,
18
- create_content_type_verifying_s3(file_to_upload),
19
- 'some_bucket_name',
58
+ s3_client,
59
+ config,
20
60
  'features/support/test_site_dirs/my.blog.com/_site')
21
61
  end
62
+ end
22
63
 
23
- def create_content_type_verifying_s3(file_to_upload)
24
- def create_objects(file_to_upload)
25
- def create_html_s3_object(file_to_upload)
26
- s3_object = stub('s3_object')
27
- content_type = (file_to_upload.end_with?'html') ? 'text/html' : 'text/css'
28
- s3_object.should_receive(:write).with(
29
- anything(),
30
- # Ensure that the write method is called with the correct content type:
31
- :content_type => content_type
32
- )
33
- s3_object
34
- end
35
- objects = {}
36
- objects[file_to_upload] = create_html_s3_object(file_to_upload)
37
- objects
38
- end
39
- def create_bucket(file_to_upload)
40
- bucket = stub('bucket')
41
- bucket.stub(:objects => create_objects(file_to_upload))
42
- bucket
64
+ def create_verifying_s3_client(file_to_upload, &block)
65
+ def create_objects(file_to_upload, &block)
66
+ def create_html_s3_object(file_to_upload, &block)
67
+ s3_object = stub('s3_object')
68
+ yield s3_object
69
+ s3_object
43
70
  end
44
- buckets = stub('buckets')
45
- buckets.stub(:[] => create_bucket(file_to_upload))
46
- s3 = stub('s3')
47
- s3.stub(:buckets => buckets)
48
- s3
71
+ objects = {}
72
+ objects[file_to_upload] = create_html_s3_object(file_to_upload, &block)
73
+ objects
74
+ end
75
+ def create_bucket(file_to_upload, &block)
76
+ bucket = stub('bucket')
77
+ bucket.stub(:objects => create_objects(file_to_upload, &block))
78
+ bucket
49
79
  end
80
+ buckets = stub('buckets')
81
+ buckets.stub(:[] => create_bucket(file_to_upload, &block))
82
+ s3 = stub('s3')
83
+ s3.stub(:buckets => buckets)
84
+ s3
50
85
  end
51
86
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-s3
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-12-06 00:00:00.000000000 Z
13
+ date: 2012-12-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: aws-sdk
@@ -19,7 +19,7 @@ dependencies:
19
19
  requirements:
20
20
  - - ~>
21
21
  - !ruby/object:Gem::Version
22
- version: 1.5.6
22
+ version: 1.8.0
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -27,7 +27,7 @@ dependencies:
27
27
  requirements:
28
28
  - - ~>
29
29
  - !ruby/object:Gem::Version
30
- version: 1.5.6
30
+ version: 1.8.0
31
31
  - !ruby/object:Gem::Dependency
32
32
  name: filey-diff
33
33
  requirement: !ruby/object:Gem::Requirement