jekyll-s3 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
data/README.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # jekyll-s3
2
2
 
3
+ [![Build
4
+ Status](https://secure.travis-ci.org/laurilehmijoki/jekyll-s3.png)]
5
+ (http://travis-ci.org/laurilehmijoki/jekyll-s3)
6
+
7
+
3
8
  Deploy your jekyll site to S3.
4
9
 
5
10
  ## Install
@@ -14,6 +19,7 @@ Deploy your jekyll site to S3.
14
19
  s3_id: YOUR_AWS_S3_ACCESS_KEY_ID
15
20
  s3_secret: YOUR_AWS_S3_SECRET_ACCESS_KEY
16
21
  s3_bucket: your.blog.bucket.com
22
+ cloudfront_distribution_id: YOUR_CLOUDFRONT_DIST_ID (OPTIONAL)
17
23
  </pre>
18
24
 
19
25
  * Edit it with your details.
@@ -30,12 +36,23 @@ s3_bucket: your.blog.bucket.com
30
36
  * Visit the website endpoint:
31
37
  (http://yourblog.s3-website...amazonaws.com)
32
38
 
39
+ ## How to use Cloudfront to deliver your blog
40
+
41
+ It is easy to deliver your S3-based web site via Cloudfront, the CDN of Amazon.
42
+
43
+ * Go to <https://console.aws.amazon.com/cloudfront/home>
44
+ * Create a distribution and set the your Jekyll S3 bucket as the origin
45
+ * Add the `cloudfront_distribution_id: your-dist-id` setting into
46
+ `_jekyll_s3.yml`
47
+ * Run `jekyll-s3` to deploy your site to S3 and invalidate the Cloudfront
48
+ distribution
49
+
33
50
  ## Todo
34
51
 
35
52
  * Upload new / updated files *only* (using s3-sync?)
36
-
53
+
37
54
  ## Development
38
-
55
+
39
56
  * Install bundler and run `bundle install`
40
57
  * Run the integration tests by running `bundle exec cucumber`
41
58
  * Run the unit tests by running `bundle exec rspec spec/lib/*.rb`
@@ -47,4 +64,4 @@ MIT
47
64
  ## Copyright
48
65
 
49
66
  Copyright (c) 2011 VersaPay, Philippe Creux.
50
-
67
+
data/Rakefile CHANGED
@@ -1,2 +1,11 @@
1
1
  require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
+
4
+ desc "Build the project"
5
+ task :default => 'test'
6
+
7
+ desc "Run tests"
8
+ task :test do
9
+ sh "bundle exec rspec"
10
+ sh "bundle exec cucumber"
11
+ end
@@ -0,0 +1,22 @@
1
+ Feature: Invalidate the Cloudfront distribution
2
+
3
+ In order to publish my posts
4
+ As a blogger who delivers his blog via an S3-based Cloudfront distribution
5
+ I want to run jekyll-s3
6
+ And see, that the items in the distribution were invalidated
7
+ So that my latest updates will be immediately available to readers
8
+
9
+ Scenario: Run jekyll-s3 for the first time
10
+ Given a directory named "_site"
11
+ When I run `jekyll-s3`
12
+ Then the output should contain:
13
+ """
14
+ I've just generated a file called _jekyll_s3.yml. Go put your details in it!
15
+ """
16
+ Then the file "_jekyll_s3.yml" should contain:
17
+ """
18
+ s3_id: YOUR_AWS_S3_ACCESS_KEY_ID
19
+ s3_secret: YOUR_AWS_S3_SECRET_ACCESS_KEY
20
+ s3_bucket: your.blog.bucket.com
21
+ cloudfront_distribution_id: YOUR_CLOUDFRONT_DIST_ID (OPTIONAL)
22
+ """
@@ -6,20 +6,24 @@ Gem::Specification.new do |s|
6
6
  s.name = "jekyll-s3"
7
7
  s.version = Jekyll::S3::VERSION
8
8
  s.platform = Gem::Platform::RUBY
9
- s.authors = ["Philippe Creux"]
10
- s.email = ["pcreux@gmail.com"]
11
- s.homepage = "https://github.com/versapay/jekyll-s3"
12
- s.summary = %q{Push your jekyll blog to S3"}
13
- s.description = %q{Push your jekyll blog to AWS S3}
9
+ s.authors = ["Philippe Creux", "Lauri Lehmijoki"]
10
+ s.email = ["pcreux@gmail.com", "lauri.lehmijoki@iki.fi"]
11
+ s.homepage = "https://github.com/laurilehmijoki/jekyll-s3"
12
+ s.summary = %q{Push your Jekyll blog to S3}
13
+ s.description = %q{This Gem allows you to push your Jekyll blog to AWS S3.
14
+ In addition, you can use this Gem to invalidate the related Cloudfront
15
+ distribution, making it easy to deliver your blog via the CDN.}
14
16
 
15
17
  s.default_executable = %q{jekyll-s3}
16
18
 
17
19
  s.add_dependency 'aws-s3'
20
+ s.add_dependency 'simple-cloudfront-invalidator'
18
21
 
19
22
  s.add_development_dependency 'rspec'
20
23
  s.add_development_dependency 'mocha'
21
24
  s.add_development_dependency 'cucumber'
22
25
  s.add_development_dependency 'aruba', '>= 0.4.7'
26
+ s.add_development_dependency 'rake'
23
27
 
24
28
  s.files = `git ls-files`.split("\n")
25
29
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -0,0 +1,15 @@
1
+ module Jekyll
2
+ module Cloudfront
3
+ class Invalidator
4
+ def self.invalidate(
5
+ aws_key, aws_secret, s3_bucket_name, cloudfront_distribution_id)
6
+ bucket = AWS::S3::Bucket.find(s3_bucket_name)
7
+ s3_object_keys = bucket.objects.map { |f| f.key }
8
+ report = SimpleCloudfrontInvalidator::CloudfrontClient.new(
9
+ aws_key, aws_secret, cloudfront_distribution_id).invalidate(
10
+ s3_object_keys)
11
+ puts report
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,6 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'yaml'
3
3
  require 'aws/s3'
4
+ require 'simple-cloudfront-invalidator'
4
5
 
5
6
  module Jekyll
6
7
  module S3
@@ -10,3 +11,7 @@ end
10
11
  %w{errors uploader cli}.each do |file|
11
12
  require File.dirname(__FILE__) + "/jekyll-s3/#{file}"
12
13
  end
14
+
15
+ %w{invalidator}.each do |file|
16
+ require File.dirname(__FILE__) + "/cloudfront/#{file}"
17
+ end
@@ -8,8 +8,8 @@ module Jekyll
8
8
  s3_id: YOUR_AWS_S3_ACCESS_KEY_ID
9
9
  s3_secret: YOUR_AWS_S3_SECRET_ACCESS_KEY
10
10
  s3_bucket: your.blog.bucket.com
11
+ cloudfront_distribution_id: YOUR_CLOUDFRONT_DIST_ID (OPTIONAL)
11
12
  EOF
12
-
13
13
 
14
14
  def self.run!
15
15
  new.run!
@@ -18,11 +18,20 @@ s3_bucket: your.blog.bucket.com
18
18
  def run!
19
19
  check_jekyll_project!
20
20
  check_s3_configuration!
21
+ load_configuration
21
22
  upload_to_s3!
23
+ invalidate_cf_dist_if_configured!
22
24
  end
23
25
 
24
26
  protected
25
-
27
+
28
+ def invalidate_cf_dist_if_configured!
29
+ cloudfront_configured = @cloudfront_distribution_id != nil && @cloudfront_distribution_id != ''
30
+ Jekyll::Cloudfront::Invalidator.invalidate(
31
+ @s3_id, @s3_secret, @s3_bucket, @cloudfront_distribution_id
32
+ ) if cloudfront_configured
33
+ end
34
+
26
35
  def run_with_retry
27
36
  begin
28
37
  yield
@@ -32,7 +41,7 @@ s3_bucket: your.blog.bucket.com
32
41
  retry
33
42
  end
34
43
  end
35
-
44
+
36
45
  def local_files
37
46
  Dir[SITE_DIR + '/**/*'].
38
47
  delete_if { |f| File.directory?(f) }.
@@ -72,7 +81,7 @@ s3_bucket: your.blog.bucket.com
72
81
 
73
82
  delete_all = false
74
83
  keep_all = false
75
- to_delete.each do |f|
84
+ to_delete.each do |f|
76
85
  delete = false
77
86
  keep = false
78
87
  until delete || delete_all || keep || keep_all
@@ -104,33 +113,40 @@ s3_bucket: your.blog.bucket.com
104
113
  end
105
114
 
106
115
  # Raise NoConfigurationFileError if the configuration file does not exists
107
- # Raise MalformedConfigurationFileError if the configuration file does not contain the keys we expect
108
- # Loads the configuration if everything looks cool
109
116
  def check_s3_configuration!
110
117
  unless File.exists?(CONFIGURATION_FILE)
111
118
  create_template_configuration_file
112
119
  raise NoConfigurationFileError
113
120
  end
114
- raise MalformedConfigurationFileError unless load_configuration
115
121
  end
116
122
 
117
123
  # Load configuration from _jekyll_s3.yml
118
- # Return true if all values are set and not emtpy
124
+ # Raise MalformedConfigurationFileError if the configuration file does not contain the keys we expect
119
125
  def load_configuration
120
- config = YAML.load_file(CONFIGURATION_FILE) rescue nil
121
- return false unless config
126
+ config = load_yaml_file
127
+ raise MalformedConfigurationFileError unless config
122
128
 
123
129
  @s3_id = config['s3_id']
124
130
  @s3_secret = config['s3_secret']
125
131
  @s3_bucket = config['s3_bucket']
132
+ @cloudfront_distribution_id = config['cloudfront_distribution_id']
126
133
 
127
- [@s3_id, @s3_secret, @s3_bucket].select { |k| k.nil? || k == '' }.empty?
134
+ raise MalformedConfigurationFileError unless
135
+ [@s3_id, @s3_secret, @s3_bucket].select { |k| k.nil? || k == '' }.empty?
128
136
  end
129
137
 
130
138
  def create_template_configuration_file
131
139
  File.open(CONFIGURATION_FILE, 'w') { |f| f.write(CONFIGURATION_FILE_TEMPLATE) }
132
140
 
133
141
  end
142
+
143
+ def load_yaml_file
144
+ begin
145
+ config = YAML.load_file(CONFIGURATION_FILE)
146
+ rescue Exception
147
+ raise MalformedConfigurationFileError
148
+ end
149
+ end
134
150
  end
135
151
  end
136
152
  end
@@ -1,5 +1,5 @@
1
1
  module Jekyll
2
2
  module S3
3
- VERSION = "0.0.4"
3
+ VERSION = "0.0.5"
4
4
  end
5
5
  end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Jekyll::Cloudfront::Invalidator do
4
+ describe "#invalidate cloudfront items" do
5
+ it "should retrieve all objects from the S3 bucket and call invalidation on them" do
6
+ s3_object_keys = ["key1", "key2"]
7
+ s3_objects = s3_object_keys.map { |key| S3Object.new(key) }
8
+ @s3_bucket_name = "my-s3-bucket"
9
+ AWS::S3::Bucket.expects(:find).with(@s3_bucket_name).returns(S3Bucket.new(s3_objects))
10
+ SimpleCloudfrontInvalidator::CloudfrontClient.any_instance.
11
+ expects(:invalidate).with(s3_object_keys)
12
+
13
+ Jekyll::Cloudfront::Invalidator.invalidate("", "", @s3_bucket_name, "")
14
+ end
15
+ end
16
+ end
17
+
18
+ class S3Bucket
19
+ def initialize(s3_objects)
20
+ @s3_objects = s3_objects
21
+ end
22
+
23
+ def objects
24
+ @s3_objects
25
+ end
26
+ end
27
+
28
+ class S3Object
29
+ def initialize(key)
30
+ @key = key
31
+ end
32
+
33
+ def key
34
+ @key
35
+ end
36
+ end
@@ -1,12 +1,8 @@
1
- require File.dirname(__FILE__) + "/../../lib/jekyll-s3.rb"
2
-
3
- RSpec.configure do |config|
4
- config.mock_framework = :mocha
5
- end
1
+ require 'spec_helper'
6
2
 
7
3
  describe Jekyll::S3::Uploader do
8
4
  describe "#upload_to_s3" do
9
-
5
+
10
6
  before :each do
11
7
  AWS::S3::Base.expects(:establish_connection!).at_least(1).returns true
12
8
  AWS::S3::Service.expects(:buckets).at_least(1).returns []
@@ -14,20 +10,53 @@ describe Jekyll::S3::Uploader do
14
10
  bucket = mock()
15
11
  bucket.expects(:objects).returns []
16
12
  AWS::S3::Bucket.expects(:find).at_least(1).returns bucket
17
-
13
+
18
14
  @uploader = Jekyll::S3::Uploader.new
19
15
  @uploader.expects(:local_files).at_least(1).returns ['index.html']
20
16
  @uploader.expects(:open).at_least(1).returns true
21
17
  end
22
-
18
+
23
19
  it "should work right when there are no exceptions" do
24
20
  AWS::S3::S3Object.expects(:store).at_least(1).returns(true)
25
21
  @uploader.send(:upload_to_s3!).should
26
22
  end
27
-
23
+
28
24
  it "should properly handle exceptions on uploading to S3" do
29
25
  AWS::S3::S3Object.expects(:store).raises(AWS::S3::RequestTimeout.new('timeout', 'timeout')).then.at_least(1).returns(true)
30
26
  @uploader.send(:upload_to_s3!).should
31
27
  end
32
28
  end
33
- end
29
+
30
+ describe "#call_cloudfront_invalidation" do
31
+ it "should invalidate Cloudfront items if the configuration 'cloudfront_dist_id' exists" do
32
+ configure_uploader({
33
+ "s3_id" => "xx",
34
+ "s3_secret" => "zz",
35
+ "s3_bucket" => "bucket",
36
+ "cloudfront_distribution_id" => "dist id"
37
+ })
38
+ Jekyll::Cloudfront::Invalidator.expects(:invalidate).with("xx", "zz", "bucket", "dist id")
39
+ Jekyll::S3::Uploader.run!
40
+ end
41
+
42
+ it "should skip calling Cloudfront if the configuration 'cloudfront_dist_id' is missing" do
43
+ configure_uploader({
44
+ "s3_id" => "xx",
45
+ "s3_secret" => "zz",
46
+ "s3_bucket" => "bucket"
47
+ })
48
+ Jekyll::Cloudfront::Invalidator.expects(:invalidate).never
49
+ Jekyll::S3::Uploader.run!
50
+ end
51
+
52
+ def configure_uploader(config)
53
+ def disable_methods_that_interact_with_world
54
+ Jekyll::S3::Uploader.any_instance.expects(:upload_to_s3!).returns nil
55
+ Jekyll::S3::Uploader.any_instance.expects(:check_jekyll_project!).returns nil
56
+ Jekyll::S3::Uploader.any_instance.expects(:check_s3_configuration!).returns nil
57
+ end
58
+ YAML.expects(:load_file).with('_jekyll_s3.yml').returns(config)
59
+ disable_methods_that_interact_with_world
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,6 @@
1
+ require File.dirname(__FILE__) + "/../lib/jekyll-s3.rb"
2
+
3
+ RSpec.configure do |config|
4
+ config.mock_framework = :mocha
5
+ end
6
+
metadata CHANGED
@@ -1,150 +1,195 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: jekyll-s3
3
- version: !ruby/object:Gem::Version
4
- hash: 23
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.5
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 4
10
- version: 0.0.4
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Philippe Creux
9
+ - Lauri Lehmijoki
14
10
  autorequire:
15
11
  bindir: bin
16
12
  cert_chain: []
17
-
18
- date: 2011-11-18 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
13
+ date: 2012-08-28 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
21
16
  name: aws-s3
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
22
24
  prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: simple-cloudfront-invalidator
33
+ requirement: !ruby/object:Gem::Requirement
24
34
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 3
29
- segments:
30
- - 0
31
- version: "0"
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
32
39
  type: :runtime
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
35
- name: rspec
36
40
  prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
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: rspec
49
+ requirement: !ruby/object:Gem::Requirement
38
50
  none: false
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- hash: 3
43
- segments:
44
- - 0
45
- version: "0"
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
46
55
  type: :development
47
- version_requirements: *id002
48
- - !ruby/object:Gem::Dependency
49
- name: mocha
50
56
  prerelease: false
51
- requirement: &id003 !ruby/object:Gem::Requirement
57
+ version_requirements: !ruby/object:Gem::Requirement
52
58
  none: false
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- hash: 3
57
- segments:
58
- - 0
59
- version: "0"
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ - !ruby/object:Gem::Dependency
64
+ name: mocha
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
60
71
  type: :development
61
- version_requirements: *id003
62
- - !ruby/object:Gem::Dependency
63
- name: cucumber
64
72
  prerelease: false
65
- requirement: &id004 !ruby/object:Gem::Requirement
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ - !ruby/object:Gem::Dependency
80
+ name: cucumber
81
+ requirement: !ruby/object:Gem::Requirement
66
82
  none: false
67
- requirements:
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- hash: 3
71
- segments:
72
- - 0
73
- version: "0"
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
74
87
  type: :development
75
- version_requirements: *id004
76
- - !ruby/object:Gem::Dependency
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ - !ruby/object:Gem::Dependency
77
96
  name: aruba
97
+ requirement: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: 0.4.7
103
+ type: :development
78
104
  prerelease: false
79
- requirement: &id005 !ruby/object:Gem::Requirement
105
+ version_requirements: !ruby/object:Gem::Requirement
80
106
  none: false
81
- requirements:
82
- - - ">="
83
- - !ruby/object:Gem::Version
84
- hash: 1
85
- segments:
86
- - 0
87
- - 4
88
- - 7
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
89
110
  version: 0.4.7
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
90
119
  type: :development
91
- version_requirements: *id005
92
- description: Push your jekyll blog to AWS S3
93
- email:
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ description: ! 'This Gem allows you to push your Jekyll blog to AWS S3.
128
+
129
+ In addition, you can use this Gem to invalidate the related Cloudfront
130
+
131
+ distribution, making it easy to deliver your blog via the CDN.'
132
+ email:
94
133
  - pcreux@gmail.com
95
- executables:
134
+ - lauri.lehmijoki@iki.fi
135
+ executables:
96
136
  - jekyll-s3
97
137
  extensions: []
98
-
99
138
  extra_rdoc_files: []
100
-
101
- files:
139
+ files:
102
140
  - .gitignore
141
+ - .travis.yml
103
142
  - Gemfile
104
143
  - README.md
105
144
  - Rakefile
106
145
  - bin/jekyll-s3
146
+ - features/jekyll-s3-cloudfront.feature
107
147
  - features/jekyll-s3.feature
108
148
  - features/support/env.rb
109
149
  - jekyll-s3.gemspec
150
+ - lib/cloudfront/invalidator.rb
110
151
  - lib/jekyll-s3.rb
111
152
  - lib/jekyll-s3/cli.rb
112
153
  - lib/jekyll-s3/errors.rb
113
154
  - lib/jekyll-s3/uploader.rb
114
155
  - lib/jekyll-s3/version.rb
156
+ - spec/lib/invalidator_spec.rb
115
157
  - spec/lib/uploader_spec.rb
116
- homepage: https://github.com/versapay/jekyll-s3
158
+ - spec/spec_helper.rb
159
+ homepage: https://github.com/laurilehmijoki/jekyll-s3
117
160
  licenses: []
118
-
119
161
  post_install_message:
120
162
  rdoc_options: []
121
-
122
- require_paths:
163
+ require_paths:
123
164
  - lib
124
- required_ruby_version: !ruby/object:Gem::Requirement
165
+ required_ruby_version: !ruby/object:Gem::Requirement
125
166
  none: false
126
- requirements:
127
- - - ">="
128
- - !ruby/object:Gem::Version
129
- hash: 3
130
- segments:
167
+ requirements:
168
+ - - ! '>='
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ segments:
131
172
  - 0
132
- version: "0"
133
- required_rubygems_version: !ruby/object:Gem::Requirement
173
+ hash: 671964648276143186
174
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
175
  none: false
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- hash: 3
139
- segments:
176
+ requirements:
177
+ - - ! '>='
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ segments:
140
181
  - 0
141
- version: "0"
182
+ hash: 671964648276143186
142
183
  requirements: []
143
-
144
184
  rubyforge_project:
145
- rubygems_version: 1.8.11
185
+ rubygems_version: 1.8.24
146
186
  signing_key:
147
187
  specification_version: 3
148
- summary: Push your jekyll blog to S3"
149
- test_files: []
150
-
188
+ summary: Push your Jekyll blog to S3
189
+ test_files:
190
+ - features/jekyll-s3-cloudfront.feature
191
+ - features/jekyll-s3.feature
192
+ - features/support/env.rb
193
+ - spec/lib/invalidator_spec.rb
194
+ - spec/lib/uploader_spec.rb
195
+ - spec/spec_helper.rb