paperclip-aws 1.6.1 → 1.6.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.
Files changed (5) hide show
  1. data/README.md +24 -10
  2. data/VERSION +1 -1
  3. data/lib/paperclip-aws.rb +48 -24
  4. data/paperclip-aws.gemspec +2 -2
  5. metadata +11 -11
data/README.md CHANGED
@@ -10,16 +10,15 @@
10
10
  * supports both `http` and `https` urls;
11
11
  * supports expiring urls;
12
12
  * supports different permissions for each Paperclip style;
13
- * can generate urls for `read`, `write` и `delete` operations;
14
- * correctly sets content-type of uploaded files;
15
- * ability to set content-disposition of uploaded files;
13
+ * supports generating urls for `read`, `write` и `delete` operations;
16
14
  * **supports amazon server side encryption** (thanks to @pvertenten);
15
+ * **supports versioning**;
17
16
  * highly compatible with included in Paperclip S3 storage module
18
17
 
19
18
 
20
19
  ## Requirements ##
21
20
 
22
- * [paperclip][0] ~> 2.4
21
+ * [paperclip][0] ~> 2.6
23
22
  * [aws-sdk][1] >= 1.2.0
24
23
 
25
24
  ## Installation ##
@@ -46,7 +45,7 @@ After this add 'paperclip-aws' to your `Gemfile` or `environment.rb`
46
45
  :secret_access_key => self.s3_config['secret_access_key'],
47
46
  :endpoint => self.s3_config['endpoint']
48
47
  },
49
- :bucket => self.s3_config['bucket'],
48
+ :s3_bucket => self.s3_config['bucket'],
50
49
  :s3_host_alias => self.s3_config['s3_host_alias'],
51
50
  :s3_permissions => :public_read,
52
51
  :s3_protocol => 'http',
@@ -109,12 +108,12 @@ Default protocol to use: `'http'` or `'https'`.
109
108
  ### :s3_options ###
110
109
  Hash of additional options. Available options are:
111
110
 
112
- * `:sse` – `'AES256'` (the only available encryption now)
111
+ * `:server_side_encryption` – `'AES256'` (the only available encryption now)
113
112
  * `:storage_class` – `:standard` (default) or `:reduced_redundancy`
114
113
  * `:content_disposition`
115
114
 
116
115
 
117
- ## How `paperclip-aws` creates urls?
116
+ ## How `paperclip-aws` creates urls? ##
118
117
 
119
118
  'paperclip-aws' redefines Paperclip `url` method to get object URL.
120
119
 
@@ -143,13 +142,28 @@ Supported options are:
143
142
 
144
143
  Default is set to `:read`, which is the most common used.
145
144
 
146
- ## Can I use it in production?
145
+ ## Versioning ##
146
+
147
+ 'paperclip-aws' lets you easily use S3 file versioning if it is enabled for selected bucket.
148
+ To find more information about versioning and how to enable it, please follow [AWS FAQs](http://aws.amazon.com/s3/faqs/#What_is_Versioning) and [AWS S3 Docs](http://docs.amazonwebservices.com/AmazonS3/latest/dev/Versioning.html).
149
+
150
+ Also you can enable versioning from your Rails console by using following code:
151
+
152
+ some_s3_attachment.data.bucket.enable_versioning
153
+
154
+ Please make sure, that user that is used to connect to S3 has enough permissions to do this, or you will get `AWS::S3::Errors::AccessDenied` error.
155
+
156
+ To get array of file versions use #versions method:
157
+
158
+ some_s3_attachment.data.versions()
159
+
160
+ ## Can I use it in production? ##
147
161
 
148
162
  Yes, usage of **paperclip-aws** is confirmed by several rather big projects:
149
163
 
150
164
  * [www.sdelki.ru](http://www.sdelki.ru)
151
- * [www.lienlog.com](http://www.lienlog.com) (opens for public in December 2011)
152
- * [www.sharypic.com](http://www.sharypic.com) (soon)
165
+ * [www.lienlog.com](http://www.lienlog.com)
166
+ * [www.sharypic.com](http://www.sharypic.com)
153
167
 
154
168
  I hope that it is used in a lot of other projects, if you know them – let me know.
155
169
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.6.1
1
+ 1.6.5
data/lib/paperclip-aws.rb CHANGED
@@ -18,12 +18,12 @@ module Paperclip
18
18
  attr_accessor :s3_credentials, :s3_bucket, :s3_permissions, :s3_options, :s3_protocol, :s3_host_alias
19
19
 
20
20
  base.instance_eval do
21
- self.setup_credentials
22
- self.setup_bucket
23
- self.setup_permissions
24
- self.setup_s3_protocol
21
+ self.setup_s3_credentials
22
+ self.setup_s3_bucket
23
+ self.setup_s3_permissions
24
+ self.setup_s3_protocol
25
25
  self.setup_s3_options
26
- self.setup_s3_host_alias
26
+ self.setup_s3_host_alias
27
27
  end
28
28
  end
29
29
 
@@ -58,13 +58,34 @@ module Paperclip
58
58
  return URI.escape(url)
59
59
  end
60
60
  end
61
+
62
+ def bucket
63
+ @bucket ||= self.s3.buckets[@s3_bucket]
64
+ end
65
+
66
+ def s3_bucket=(value)
67
+ @bucket = nil
68
+
69
+ @s3_bucket = value
70
+ @s3_bucket = @s3_bucket.call(self) if @s3_bucket.is_a?(Proc)
71
+ end
72
+
73
+ def versions(style = default_style)
74
+ begin
75
+ return nil unless self.bucket.versioning_enabled?
76
+ self.bucket.objects[path(style)].versions
77
+ rescue AWS::S3::Errors::Base => e
78
+ log "ERROR: Error occured while fetching versions for `#{path(style)}`. Probably versions are disabled or suspended for `#{self.bucket.name}` bucket."
79
+ return nil
80
+ end
81
+ end
61
82
 
62
83
  def exists?(style = default_style)
63
84
  if path(style).nil? || path(style).to_s.strip == ""
64
85
  return false
65
86
  end
66
87
  begin
67
- return self.s3.buckets[@s3_bucket].objects[path(style)].exists?
88
+ return self.bucket.objects[path(style)].exists?
68
89
  rescue AWS::S3::Errors::Base
69
90
  return false
70
91
  end
@@ -87,7 +108,7 @@ module Paperclip
87
108
  basename = File.basename(filename, extname)
88
109
  file = Tempfile.new([basename, extname])
89
110
  file.binmode
90
- file.write(self.s3.buckets[@s3_bucket].objects[path(style)].read)
111
+ file.write(self.bucket.objects[path(style)].read)
91
112
  file.rewind
92
113
  return file
93
114
  end
@@ -99,7 +120,7 @@ module Paperclip
99
120
  def flush_writes #:nodoc:
100
121
  @queued_for_write.each do |style, file|
101
122
  begin
102
- log("saving #{path(style)}")
123
+ log "Saving #{path(style)}"
103
124
 
104
125
  self.s3.buckets[@s3_bucket].objects[path(style)].write({
105
126
  :file => file.path,
@@ -119,7 +140,7 @@ module Paperclip
119
140
  def flush_deletes #:nodoc:
120
141
  @queued_for_delete.each do |path|
121
142
  begin
122
- log("deleting #{path}")
143
+ log "Deleting #{path}"
123
144
  self.s3.buckets[@s3_bucket].objects[path].delete
124
145
  rescue AWS::Errors::Base => e
125
146
  raise
@@ -129,9 +150,9 @@ module Paperclip
129
150
  end
130
151
 
131
152
  # PRIVATE METHODS
132
- def setup_credentials
153
+ def setup_s3_credentials
133
154
  if @options[:s3_credentials].present?
134
- @s3_credentials = self.parse_credentials(@options[:s3_credentials]).stringify_keys
155
+ @s3_credentials = self.parse_s3_credentials(@options[:s3_credentials]).stringify_keys
135
156
  env = Object.const_defined?(:Rails) ? Rails.env : nil
136
157
 
137
158
  @s3_credentials = (@s3_credentials[env] || @s3_credentials).symbolize_keys
@@ -140,9 +161,9 @@ module Paperclip
140
161
  raise ArgumentError, "missing required :s3_credentials option"
141
162
  end
142
163
  end
143
- protected :setup_credentials
164
+ protected :setup_s3_credentials
144
165
 
145
- def parse_credentials(creds)
166
+ def parse_s3_credentials(creds)
146
167
  case creds
147
168
  when File
148
169
  YAML::load(ERB.new(File.read(creds.path)).result)
@@ -154,24 +175,27 @@ module Paperclip
154
175
  raise ArgumentError, "Credentials are not a path, file, or hash."
155
176
  end
156
177
  end
157
- protected :parse_credentials
178
+ protected :parse_s3_credentials
158
179
 
159
- def setup_bucket
180
+ def setup_s3_bucket
160
181
  if @options[:bucket].present?
161
- @s3_bucket = @options[:bucket] || @s3_credentials[:bucket]
162
- @s3_bucket = @s3_bucket.call(self) if @s3_bucket.is_a?(Proc)
182
+ log "DEPRECATION WARNING: Passing `:bucket` options to paperclip is deprecated. Please use `:s3_bucket` instead."
183
+ end
184
+
185
+ if @options[:s3_bucket].present? || @s3_credentials[:bucket].present? || @options[:bucket].present?
186
+ self.s3_bucket = @options[:s3_bucket] || @s3_credentials[:bucket] || @options[:bucket]
163
187
  else
164
- raise ArgumentError, "missing required :bucket option"
188
+ raise ArgumentError, "missing required :s3_bucket option"
165
189
  end
166
190
  end
167
- protected :setup_bucket
191
+ protected :setup_s3_bucket
168
192
 
169
- def setup_permissions
170
- @s3_permissions = self.parse_permissions(@options[:s3_permissions])
193
+ def setup_s3_permissions
194
+ @s3_permissions = self.parse_s3_permissions(@options[:s3_permissions])
171
195
  end
172
- protected :setup_permissions
196
+ protected :setup_s3_permissions
173
197
 
174
- def parse_permissions(permissions)
198
+ def parse_s3_permissions(permissions)
175
199
  if permissions.is_a?(Hash)
176
200
  permissions[:default] = permissions[:default] || :public_read
177
201
  else
@@ -179,7 +203,7 @@ module Paperclip
179
203
  end
180
204
  permissions
181
205
  end
182
- protected :parse_permissions
206
+ protected :parse_s3_permissions
183
207
 
184
208
  def setup_s3_protocol
185
209
  @s3_protocol = @options[:s3_protocol] ||
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "paperclip-aws"
8
- s.version = "1.6.1"
8
+ s.version = "1.6.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Igor Alexandrov"]
12
- s.date = "2012-02-24"
12
+ s.date = "2012-02-27"
13
13
  s.description = "'paperclip-aws' is a full featured storage module that supports all S3 locations (US, European and Tokio) without any additional hacking."
14
14
  s.email = "igor.alexandrov@gmail.com"
15
15
  s.extra_rdoc_files = [
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paperclip-aws
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 1.6.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-24 00:00:00.000000000 Z
12
+ date: 2012-02-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: paperclip
16
- requirement: &70118178437640 !ruby/object:Gem::Requirement
16
+ requirement: &70288657009700 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.6.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70118178437640
24
+ version_requirements: *70288657009700
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: aws-sdk
27
- requirement: &70118178437140 !ruby/object:Gem::Requirement
27
+ requirement: &70288657009200 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.2.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70118178437140
35
+ version_requirements: *70288657009200
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bundler
38
- requirement: &70118180010020 !ruby/object:Gem::Requirement
38
+ requirement: &70288657008700 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.0.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70118180010020
46
+ version_requirements: *70288657008700
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: jeweler
49
- requirement: &70118180009540 !ruby/object:Gem::Requirement
49
+ requirement: &70288657008220 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: 1.6.4
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70118180009540
57
+ version_requirements: *70288657008220
58
58
  description: ! '''paperclip-aws'' is a full featured storage module that supports
59
59
  all S3 locations (US, European and Tokio) without any additional hacking.'
60
60
  email: igor.alexandrov@gmail.com
@@ -93,7 +93,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
93
93
  version: '0'
94
94
  segments:
95
95
  - 0
96
- hash: 3176807649922925597
96
+ hash: -1621524216927201616
97
97
  required_rubygems_version: !ruby/object:Gem::Requirement
98
98
  none: false
99
99
  requirements: