capistrano-s3 0.2.5 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ OTU0Yjg4Y2JlOTIyNmUwYzg0NDRmNWY5MDdkNGU0MjJlMGQxNGJkNA==
5
+ data.tar.gz: !binary |-
6
+ YTE5ODIwOTAwZDJiMDQ0YmViNTlmODI0MTIxNjQ2M2YwYWU0MjU4NA==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ZThlYmNlOGY0Y2FjZGYxZTRlMjcyNGZlZDdlZTFkYzY4ZTZhODIyMjc4NzBj
10
+ ZDdlNDc3MmVmNTZlZjVmOTBiMDM5MjVmZGRkZTEzZTgyNzIyMTE1Y2MzYTEw
11
+ NTJkMjk1OTg1OGQ4ZWJiNmNhNTg2ZTk2ZTBiZjI3ZmY0OWRkMzQ=
12
+ data.tar.gz: !binary |-
13
+ N2VlNzAxYWQ0N2UzNTdlMDg0MDExNGU2NTU1NTllZDQ1ODZiMzFjMWI4Yzk5
14
+ MTYwYmU0ZjY5ZWU1OThkNzcyMjM3Mzk5OGZhNTI4ZWMzMmZkODk0MzEyNzlh
15
+ YWY4YTQxMWQ5OTU3Mzc5NjRkZGQ0ZDY3OGM3YzQwYjhhNDkzNzA=
checksums.yaml.gz.sig ADDED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- capistrano-s3 (0.2.5)
4
+ capistrano-s3 (0.2.6)
5
5
  aws-sdk
6
6
  capistrano
7
7
  mime-types
@@ -9,7 +9,7 @@ PATH
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
- aws-sdk (1.8.3.1)
12
+ aws-sdk (1.8.5)
13
13
  json (~> 1.4)
14
14
  nokogiri (>= 1.4.4)
15
15
  uuidtools (~> 2.1)
@@ -19,9 +19,9 @@ GEM
19
19
  net-sftp (>= 2.0.0)
20
20
  net-ssh (>= 2.0.14)
21
21
  net-ssh-gateway (>= 1.1.0)
22
- highline (1.6.15)
22
+ highline (1.6.16)
23
23
  json (1.7.7)
24
- mime-types (1.21)
24
+ mime-types (1.22)
25
25
  net-scp (1.1.0)
26
26
  net-ssh (>= 2.6.5)
27
27
  net-sftp (2.1.1)
@@ -29,8 +29,8 @@ GEM
29
29
  net-ssh (2.6.6)
30
30
  net-ssh-gateway (1.2.0)
31
31
  net-ssh (>= 2.6.5)
32
- nokogiri (1.5.6)
33
- rake (10.0.3)
32
+ nokogiri (1.5.9)
33
+ rake (10.0.4)
34
34
  uuidtools (2.1.3)
35
35
 
36
36
  PLATFORMS
data/NEWS CHANGED
@@ -1,3 +1,10 @@
1
+ New in 0.2.6
2
+
3
+ * Feature : Adds ability to specify redirect location for files. (#13) @aledovsky
4
+ * Feature : Adds S3 endpoint selection option. (#11) @aledovsky
5
+ * Improvement : Require fileutils to support newer rubies. (#10) @douglasjarquin
6
+ * Bugfix : Pass a string to the content_type option (#11) @douglasjarquin
7
+
1
8
  New in 0.2.5
2
9
 
3
10
  * Improvement : signed gem.
data/README.md CHANGED
@@ -8,23 +8,30 @@
8
8
 
9
9
  ## Hosting your website with Amazon S3
10
10
 
11
- S3 provides special website enabled buckets that allows you to deliver website pages directly from S3.
12
- The most important difference is that theses buckets serves an index document (ex. index.html) whenever a user specifies the URL for the root of your website, or a subfolder. And you can point your domain name directly to the S3 bucket cname.
11
+ Amazon S3 provides special websites enabled buckets that allows you to serve web pages from S3.
13
12
 
14
- To learn how to setup your website bucket, see [Amazon Documentation](http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?HostingWebsiteQS1.html).
13
+ To learn how to setup your website bucket, see [Amazon Documentation](http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html).
15
14
 
16
15
  ## Getting started
17
16
 
18
- Setup capistrano, create a public folder and set your S3 bucket configurations in `deploy.rb`.
17
+ Create a project `Gemfile` :
19
18
 
20
- $ capify .
21
- $ mkdir public
22
- $ touch config/deploy.rb #see config instructions bellow
23
- $ cap deploy
19
+ ```ruby
20
+ source 'https://rubygems.org'
21
+ gem 'capistrano-s3'
22
+ ```
23
+
24
+ ### Setup
25
+
26
+ Install gem, init capistrano & create a public folder that will be published :
27
+
28
+ bundle install
29
+ bundle exec capify .
30
+ mkdir public
24
31
 
25
- ### Configuring deployment
32
+ ### Credentials
26
33
 
27
- capistrano-s3 overrides the default Capistrano recipes for Rails projects with its own simple s3 publishing scripts.
34
+ Set your S3 bucket credentials :
28
35
 
29
36
  ```ruby
30
37
  # config/deploy.rb
@@ -35,9 +42,36 @@ set :access_key_id, "CHANGETHIS"
35
42
  set :secret_access_key, "CHANGETHIS"
36
43
  ```
37
44
 
45
+ _Note_: If you are using S3 in non-default region (e.g. EU), you should provide
46
+ corresponding
47
+ [endpoint](http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region)
48
+ via configuration option
49
+ ```ruby
50
+ set :s3_endpoint, 's3-eu-west-1.amazonaws.com'
51
+ ```
52
+
53
+ ### Deploying
54
+
55
+ Add content to you public folder and deploy with :
56
+
57
+ cap deploy
58
+
38
59
  If you want to deploy to multiple buckets, have a look at
39
60
  [Capistrano multistage](https://github.com/capistrano/capistrano/wiki/2.x-Multistage-Extension)
40
- and configure a bucket per stage configuration.
61
+ and configure a bucket per stage configuration.
62
+
63
+ #### Redirecting
64
+
65
+ Use `:redirect_options` to natively redirect (via HTTP 301 status code)
66
+ any hosted page. For example:
67
+ ```ruby
68
+ set :redirect_options, {
69
+ 'index.html' => 'http://example.org',
70
+ 'another.html' => '/test.html',
71
+ }
72
+ ```
73
+ Valid redirect destination should either start with `http` or `https` scheme,
74
+ or begin with leading slash `/`.
41
75
 
42
76
  #### S3 write options
43
77
 
@@ -49,9 +83,9 @@ set :bucket_write_options, {
49
83
  }
50
84
  ```
51
85
 
52
- See aws-sdk [S3Object.write doc](http://rubydoc.info/github/amazonwebservices/aws-sdk-for-ruby/master/AWS/S3/S3Object#write-instance_method) for all available options.
86
+ See aws-sdk [S3Client.put_object doc](http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/Client.html#put_object-instance_method) for all available options.
53
87
 
54
- ## Exemple of usage
88
+ ## Example of usage
55
89
 
56
90
  Our Ruby stack for static websites :
57
91
 
@@ -69,7 +103,9 @@ before 'deploy' do
69
103
  end
70
104
  ```
71
105
 
72
- See our boilerplate [sinatra-static-bp](https://github.com/hooktstudios/sinatra-static-bp) for an exemple of the complete setup.
106
+ See our boilerplate
107
+ [sinatra-static-bp](https://github.com/hooktstudios/sinatra-static-bp)
108
+ for an example of the complete setup.
73
109
 
74
110
  ## Contributing
75
111
 
@@ -80,3 +116,5 @@ See [CONTRIBUTING.md](https://github.com/hooktstudios/capistrano-s3/blob/master/
80
116
  ![hooktstudios](http://hooktstudios.com/logo.png)
81
117
 
82
118
  [capistrano-s3](https://rubygems.org/gems/capistrano-s3) is maintained and funded by [hooktstudios](http://github.com/hooktstudios)
119
+
120
+ Thanks & credits also to all other [contributors](https://github.com/hooktstudios/capistrano-s3/contributors).
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  Gem::Specification.new do |s|
4
- s.authors = ['Jean-Philippe Doyle','Josh Delsman']
4
+ s.authors = ['Jean-Philippe Doyle','Josh Delsman','Aleksandrs Ļedovskis','Douglas Jarquin']
5
5
  s.email = ['jeanphilippe.doyle@hooktstudios.com']
6
6
  s.description = 'Enables static websites deployment to Amazon S3 website buckets using Capistrano.'
7
7
  s.summary = 'Build and deploy a static website to Amazon S3'
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
12
12
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
13
13
  s.name = 'capistrano-s3'
14
14
  s.require_paths = ['lib']
15
- s.version = '0.2.5'
15
+ s.version = '0.2.6'
16
16
  s.cert_chain = ['certs/j15e.pem']
17
17
  s.signing_key = File.expand_path('~/.gem/private_key.pem') if $0 =~ /gem\z/
18
18
 
data/lib/capistrano/s3.rb CHANGED
@@ -2,31 +2,35 @@ require 'capistrano'
2
2
  require 'capistrano/s3/publisher'
3
3
 
4
4
  unless Capistrano::Configuration.respond_to?(:instance)
5
- abort "capistrano-s3 requires Capistrano >= 2."
5
+ abort "capistrano-s3 requires Capistrano 2.0 or newer"
6
6
  end
7
7
 
8
8
  Capistrano::Configuration.instance(true).load do
9
9
  def _cset(name, *args, &block)
10
10
  set(name, *args, &block) if !exists?(name)
11
11
  end
12
-
12
+
13
13
  _cset :deployment_path, Dir.pwd.gsub("\n", "") + "/public"
14
14
  _cset :bucket_write_options, :acl => :public_read
15
-
15
+ _cset :s3_endpoint, 's3.amazonaws.com'
16
+ _cset :redirect_options, {}
17
+
16
18
  # Deployment recipes
17
19
  namespace :deploy do
18
- namespace :s3 do
20
+ namespace :s3 do
19
21
  desc "Empties bucket of all files. Caution when using this command, as it cannot be undone!"
20
22
  task :empty do
21
- Publisher.clear!(access_key_id, secret_access_key)
23
+ Publisher.clear!(s3_endpoint, access_key_id, secret_access_key, bucket)
22
24
  end
23
25
 
24
26
  desc "Upload files to the bucket in the current state"
25
27
  task :upload_files do
26
- Publisher.publish!(access_key_id, secret_access_key, bucket, deployment_path, bucket_write_options)
28
+ extra_options = { :write => bucket_write_options, :redirect => redirect_options }
29
+ Publisher.publish!(s3_endpoint, access_key_id, secret_access_key,
30
+ bucket, deployment_path, extra_options)
27
31
  end
28
32
  end
29
-
33
+
30
34
  task :update do
31
35
  s3.upload_files
32
36
  end
@@ -1,12 +1,13 @@
1
1
  require 'aws/s3'
2
2
  require 'mime/types'
3
+ require 'fileutils'
3
4
 
4
5
  module Publisher
5
6
 
6
7
  LAST_PUBLISHED_FILE = '.last_published'
7
8
 
8
- def self.publish!(key, secret, bucket, source, extra_options)
9
- s3 = self.establish_connection!(key, secret)
9
+ def self.publish!(s3_endpoint, key, secret, bucket, source, extra_options)
10
+ s3 = self.establish_s3_client_connection!(s3_endpoint, key, secret)
10
11
 
11
12
  self.files(source).each do |file|
12
13
  if !File.directory?(file)
@@ -15,48 +16,45 @@ module Publisher
15
16
  path = self.base_file_path(source, file)
16
17
  path.gsub!(/^\//, "") # Remove preceding slash for S3
17
18
 
18
- contents = open(file)
19
-
20
- types = MIME::Types.type_for(File.basename(file))
21
- if types.empty?
22
- options = {
23
- :acl => :public_read
24
- }
25
- else
26
- options = {
27
- :acl => :public_read,
28
- :content_type => types[0]
29
- }
30
- end
31
- options.merge!(extra_options)
32
- s3.buckets[bucket].objects[path].write(contents, options)
19
+ self.put_object(s3, bucket, path, file, extra_options)
33
20
  end
34
21
  end
35
22
 
36
23
  FileUtils.touch(LAST_PUBLISHED_FILE)
37
24
  end
38
25
 
39
- def self.clear!(key, secret, bucket)
40
- s3 = self.establish_connection!(key, secret)
26
+ def self.clear!(s3_endpoint, key, secret, bucket)
27
+ s3 = self.establish_s3_connection!(s3_endpoint, key, secret)
41
28
  s3.buckets[bucket].clear!
29
+
30
+ FileUtils.rm(LAST_PUBLISHED_FILE)
42
31
  end
43
32
 
44
33
  private
45
34
 
46
35
  # Establishes the connection to Amazon S3
47
- def self.establish_connection!(key, secret)
36
+ def self.establish_connection!(klass, s3_endpoint, key, secret)
48
37
  # Send logging to STDOUT
49
38
  AWS.config(:logger => Logger.new(STDOUT))
50
- AWS::S3.new(
39
+ klass.new(
40
+ :s3_endpoint => s3_endpoint,
51
41
  :access_key_id => key,
52
42
  :secret_access_key => secret
53
43
  )
54
44
  end
55
45
 
46
+ def self.establish_s3_client_connection!(s3_endpoint, key, secret)
47
+ self.establish_connection!(AWS::S3::Client, s3_endpoint, key, secret)
48
+ end
49
+
50
+ def self.establish_s3_connection!(s3_endpoint, key, secret)
51
+ self.establish_connection!(AWS::S3, s3_endpoint, key, secret)
52
+ end
53
+
56
54
  def self.base_file_path(root, file)
57
55
  file.gsub(root, "")
58
56
  end
59
-
57
+
60
58
  def self.files(deployment_path)
61
59
  Dir.glob("#{deployment_path}/**/*")
62
60
  end
@@ -65,4 +63,32 @@ module Publisher
65
63
  return false unless File.exists? LAST_PUBLISHED_FILE
66
64
  File.mtime(file) < File.mtime(LAST_PUBLISHED_FILE)
67
65
  end
68
- end
66
+
67
+ def self.put_object(s3, bucket, path, file, extra_options)
68
+ options = {
69
+ :bucket_name => bucket,
70
+ :key => path,
71
+ :data => open(file),
72
+ :acl => :public_read,
73
+ }
74
+
75
+ options.merge!( self.build_content_type_hash(file) )
76
+ options.merge!( self.build_redirect_hash(path, extra_options[:redirect]) )
77
+ options.merge!(extra_options[:write])
78
+
79
+ s3.put_object(options)
80
+ end
81
+
82
+ def self.build_content_type_hash(file)
83
+ type = MIME::Types.type_for(File.basename(file))
84
+ return {} unless type
85
+
86
+ { :content_type => type.first.content_type }
87
+ end
88
+
89
+ def self.build_redirect_hash(path, redirect_options)
90
+ return {} unless redirect_options && redirect_options[path]
91
+
92
+ { :website_redirect_location => redirect_options[path] }
93
+ end
94
+ end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-s3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
5
- prerelease:
4
+ version: 0.2.6
6
5
  platform: ruby
7
6
  authors:
8
7
  - Jean-Philippe Doyle
9
8
  - Josh Delsman
9
+ - Aleksandrs Ļedovskis
10
+ - Douglas Jarquin
10
11
  autorequire:
11
12
  bindir: bin
12
13
  cert_chain:
@@ -38,12 +39,11 @@ cert_chain:
38
39
  MjN3ZTRFMUx2ZlJuNWdWNzdEaWo2czlWNEhIek1CdUx3bk5iOFQrNmxPblVX
39
40
  YnRpSWRkRAplOGM4aTdQbHJ6aFZKLzhzWFVKc0NreUU4ZDJNeVJ5amx4TT0K
40
41
  LS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
41
- date: 2013-03-11 00:00:00.000000000 Z
42
+ date: 2013-04-11 00:00:00.000000000 Z
42
43
  dependencies:
43
44
  - !ruby/object:Gem::Dependency
44
45
  name: aws-sdk
45
46
  requirement: !ruby/object:Gem::Requirement
46
- none: false
47
47
  requirements:
48
48
  - - ! '>='
49
49
  - !ruby/object:Gem::Version
@@ -51,7 +51,6 @@ dependencies:
51
51
  type: :runtime
52
52
  prerelease: false
53
53
  version_requirements: !ruby/object:Gem::Requirement
54
- none: false
55
54
  requirements:
56
55
  - - ! '>='
57
56
  - !ruby/object:Gem::Version
@@ -59,7 +58,6 @@ dependencies:
59
58
  - !ruby/object:Gem::Dependency
60
59
  name: capistrano
61
60
  requirement: !ruby/object:Gem::Requirement
62
- none: false
63
61
  requirements:
64
62
  - - ! '>='
65
63
  - !ruby/object:Gem::Version
@@ -67,7 +65,6 @@ dependencies:
67
65
  type: :runtime
68
66
  prerelease: false
69
67
  version_requirements: !ruby/object:Gem::Requirement
70
- none: false
71
68
  requirements:
72
69
  - - ! '>='
73
70
  - !ruby/object:Gem::Version
@@ -75,7 +72,6 @@ dependencies:
75
72
  - !ruby/object:Gem::Dependency
76
73
  name: mime-types
77
74
  requirement: !ruby/object:Gem::Requirement
78
- none: false
79
75
  requirements:
80
76
  - - ! '>='
81
77
  - !ruby/object:Gem::Version
@@ -83,7 +79,6 @@ dependencies:
83
79
  type: :runtime
84
80
  prerelease: false
85
81
  version_requirements: !ruby/object:Gem::Requirement
86
- none: false
87
82
  requirements:
88
83
  - - ! '>='
89
84
  - !ruby/object:Gem::Version
@@ -91,7 +86,6 @@ dependencies:
91
86
  - !ruby/object:Gem::Dependency
92
87
  name: rake
93
88
  requirement: !ruby/object:Gem::Requirement
94
- none: false
95
89
  requirements:
96
90
  - - ! '>='
97
91
  - !ruby/object:Gem::Version
@@ -99,7 +93,6 @@ dependencies:
99
93
  type: :development
100
94
  prerelease: false
101
95
  version_requirements: !ruby/object:Gem::Requirement
102
- none: false
103
96
  requirements:
104
97
  - - ! '>='
105
98
  - !ruby/object:Gem::Version
@@ -127,26 +120,25 @@ files:
127
120
  homepage: http://github.com/hooktstudios/capistrano-s3
128
121
  licenses:
129
122
  - MIT
123
+ metadata: {}
130
124
  post_install_message:
131
125
  rdoc_options: []
132
126
  require_paths:
133
127
  - lib
134
128
  required_ruby_version: !ruby/object:Gem::Requirement
135
- none: false
136
129
  requirements:
137
130
  - - ! '>='
138
131
  - !ruby/object:Gem::Version
139
132
  version: '0'
140
133
  required_rubygems_version: !ruby/object:Gem::Requirement
141
- none: false
142
134
  requirements:
143
135
  - - ! '>='
144
136
  - !ruby/object:Gem::Version
145
137
  version: '0'
146
138
  requirements: []
147
139
  rubyforge_project:
148
- rubygems_version: 1.8.25
140
+ rubygems_version: 2.0.3
149
141
  signing_key:
150
- specification_version: 3
142
+ specification_version: 4
151
143
  summary: Build and deploy a static website to Amazon S3
152
144
  test_files: []
metadata.gz.sig CHANGED
Binary file