jekyll-s3 0.0.4 → 0.0.5

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.
@@ -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