jswanner-carrierwave 0.5.0.beta3

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 (36) hide show
  1. data/README.rdoc +553 -0
  2. data/lib/carrierwave.rb +101 -0
  3. data/lib/carrierwave/compatibility/paperclip.rb +95 -0
  4. data/lib/carrierwave/mount.rb +359 -0
  5. data/lib/carrierwave/orm/activerecord.rb +79 -0
  6. data/lib/carrierwave/orm/datamapper.rb +37 -0
  7. data/lib/carrierwave/orm/mongoid.rb +23 -0
  8. data/lib/carrierwave/orm/sequel.rb +45 -0
  9. data/lib/carrierwave/processing/image_science.rb +116 -0
  10. data/lib/carrierwave/processing/mini_magick.rb +261 -0
  11. data/lib/carrierwave/processing/rmagick.rb +278 -0
  12. data/lib/carrierwave/sanitized_file.rb +273 -0
  13. data/lib/carrierwave/storage/abstract.rb +30 -0
  14. data/lib/carrierwave/storage/cloud_files.rb +168 -0
  15. data/lib/carrierwave/storage/file.rb +48 -0
  16. data/lib/carrierwave/storage/grid_fs.rb +108 -0
  17. data/lib/carrierwave/storage/right_s3.rb +3 -0
  18. data/lib/carrierwave/storage/s3.rb +206 -0
  19. data/lib/carrierwave/test/matchers.rb +164 -0
  20. data/lib/carrierwave/uploader.rb +44 -0
  21. data/lib/carrierwave/uploader/cache.rb +146 -0
  22. data/lib/carrierwave/uploader/callbacks.rb +41 -0
  23. data/lib/carrierwave/uploader/configuration.rb +135 -0
  24. data/lib/carrierwave/uploader/default_url.rb +19 -0
  25. data/lib/carrierwave/uploader/download.rb +75 -0
  26. data/lib/carrierwave/uploader/extension_whitelist.rb +38 -0
  27. data/lib/carrierwave/uploader/mountable.rb +39 -0
  28. data/lib/carrierwave/uploader/processing.rb +85 -0
  29. data/lib/carrierwave/uploader/proxy.rb +62 -0
  30. data/lib/carrierwave/uploader/remove.rb +23 -0
  31. data/lib/carrierwave/uploader/store.rb +90 -0
  32. data/lib/carrierwave/uploader/url.rb +33 -0
  33. data/lib/carrierwave/uploader/versions.rb +157 -0
  34. data/lib/generators/templates/uploader.rb +47 -0
  35. data/lib/generators/uploader_generator.rb +13 -0
  36. metadata +374 -0
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+
3
+ module CarrierWave
4
+ module Storage
5
+
6
+ ##
7
+ # This file serves mostly as a specification for Storage engines. There is no requirement
8
+ # that storage engines must be a subclass of this class.
9
+ #
10
+ class Abstract
11
+
12
+ attr_reader :uploader
13
+
14
+ def initialize(uploader)
15
+ @uploader = uploader
16
+ end
17
+
18
+ def identifier
19
+ uploader.filename
20
+ end
21
+
22
+ def store!(file)
23
+ end
24
+
25
+ def retrieve!(identifier)
26
+ end
27
+
28
+ end # Abstract
29
+ end # Storage
30
+ end # CarrierWave
@@ -0,0 +1,168 @@
1
+ # encoding: utf-8
2
+ require 'cloudfiles'
3
+
4
+ module CarrierWave
5
+ module Storage
6
+
7
+ ##
8
+ # Uploads things to Rackspace Cloud Files webservices using the Rackspace libraries (cloudfiles gem).
9
+ # In order for CarrierWave to connect to Cloud Files, you'll need to specify an username, api key
10
+ # and container
11
+ #
12
+ # CarrierWave.configure do |config|
13
+ # config.cloud_files_username = "xxxxxx"
14
+ # config.cloud_files_api_key = "xxxxxx"
15
+ # config.cloud_files_container = "my_container"
16
+ # end
17
+ #
18
+ # You can optionally include your CDN host name in the configuration.
19
+ # This is *highly* recommended, as without it every request requires a lookup
20
+ # of this information.
21
+ #
22
+ # config.cloud_files_cdn_host = "c000000.cdn.rackspacecloud.com"
23
+ #
24
+ #
25
+ class CloudFiles < Abstract
26
+
27
+ class File
28
+
29
+ def initialize(uploader, base, path)
30
+ @uploader = uploader
31
+ @path = path
32
+ @base = base
33
+ end
34
+
35
+ ##
36
+ # Returns the current path/filename of the file on Cloud Files.
37
+ #
38
+ # === Returns
39
+ #
40
+ # [String] A path
41
+ #
42
+ def path
43
+ @path
44
+ end
45
+
46
+ ##
47
+ # Reads the contents of the file from Cloud Files
48
+ #
49
+ # === Returns
50
+ #
51
+ # [String] contents of the file
52
+ #
53
+ def read
54
+ object = cf_container.object(@path)
55
+ @content_type = object.content_type
56
+ object.data
57
+ end
58
+
59
+ ##
60
+ # Remove the file from Cloud Files
61
+ #
62
+ def delete
63
+ cf_container.delete_object(@path)
64
+ end
65
+
66
+ ##
67
+ # Returns the url on the Cloud Files CDN. Note that the parent container must be marked as
68
+ # public for this to work.
69
+ #
70
+ # === Returns
71
+ #
72
+ # [String] file's url
73
+ #
74
+ def url
75
+ if @uploader.cloud_files_cdn_host
76
+ "http://" + @uploader.cloud_files_cdn_host + "/" + @path
77
+ else
78
+ cf_container.object(@path).public_url
79
+ end
80
+ end
81
+
82
+ def content_type
83
+ cf_container.object(@path).content_type
84
+ end
85
+
86
+ def content_type=(new_content_type)
87
+ headers["content-type"] = new_content_type
88
+ end
89
+
90
+ ##
91
+ # Writes the supplied data into the object on Cloud Files.
92
+ #
93
+ # === Returns
94
+ #
95
+ # boolean
96
+ #
97
+ def store(data,headers={})
98
+ object = cf_container.create_object(@path)
99
+ object.write(data,headers)
100
+ end
101
+
102
+ private
103
+
104
+ def headers
105
+ @headers ||= { }
106
+ end
107
+
108
+ def container
109
+ @uploader.cloud_files_container
110
+ end
111
+
112
+ def connection
113
+ @base.connection
114
+ end
115
+
116
+ def cf_connection
117
+ @cf_connection ||= ::CloudFiles::Connection.new(@uploader.cloud_files_username, @uploader.cloud_files_api_key)
118
+ end
119
+
120
+ def cf_container
121
+ if @cf_container
122
+ @cf_container
123
+ else
124
+ @cf_container = cf_connection.create_container(container)
125
+ @cf_container.make_public
126
+ @cf_container
127
+ end
128
+ end
129
+
130
+
131
+ end
132
+
133
+ ##
134
+ # Store the file on Cloud Files
135
+ #
136
+ # === Parameters
137
+ #
138
+ # [file (CarrierWave::SanitizedFile)] the file to store
139
+ #
140
+ # === Returns
141
+ #
142
+ # [CarrierWave::Storage::CloudFiles::File] the stored file
143
+ #
144
+ def store!(file)
145
+ cloud_files_options = {'Content-Type' => file.content_type}
146
+ f = CarrierWave::Storage::CloudFiles::File.new(uploader, self, uploader.store_path)
147
+ f.store(file.read,cloud_files_options)
148
+ f
149
+ end
150
+
151
+ # Do something to retrieve the file
152
+ #
153
+ # @param [String] identifier uniquely identifies the file
154
+ #
155
+ # [identifier (String)] uniquely identifies the file
156
+ #
157
+ # === Returns
158
+ #
159
+ # [CarrierWave::Storage::CloudFiles::File] the stored file
160
+ #
161
+ def retrieve!(identifier)
162
+ CarrierWave::Storage::CloudFiles::File.new(uploader, self, uploader.store_path(identifier))
163
+ end
164
+
165
+
166
+ end # CloudFiles
167
+ end # Storage
168
+ end # CarrierWave
@@ -0,0 +1,48 @@
1
+ # encoding: utf-8
2
+
3
+ module CarrierWave
4
+ module Storage
5
+
6
+ ##
7
+ # File storage stores file to the Filesystem (surprising, no?). There's really not much
8
+ # to it, it uses the store_dir defined on the uploader as the storage location. That's
9
+ # pretty much it.
10
+ #
11
+ class File < Abstract
12
+
13
+ ##
14
+ # Move the file to the uploader's store path.
15
+ #
16
+ # === Parameters
17
+ #
18
+ # [file (CarrierWave::SanitizedFile)] the file to store
19
+ #
20
+ # === Returns
21
+ #
22
+ # [CarrierWave::SanitizedFile] a sanitized file
23
+ #
24
+ def store!(file)
25
+ path = ::File.expand_path(uploader.store_path, uploader.root)
26
+ file.move_to(path, uploader.permissions)
27
+ file
28
+ end
29
+
30
+ ##
31
+ # Retrieve the file from its store path
32
+ #
33
+ # === Parameters
34
+ #
35
+ # [identifier (String)] the filename of the file
36
+ #
37
+ # === Returns
38
+ #
39
+ # [CarrierWave::SanitizedFile] a sanitized file
40
+ #
41
+ def retrieve!(identifier)
42
+ path = ::File.expand_path(uploader.store_path(identifier), uploader.root)
43
+ CarrierWave::SanitizedFile.new(path)
44
+ end
45
+
46
+ end # File
47
+ end # Storage
48
+ end # CarrierWave
@@ -0,0 +1,108 @@
1
+ # encoding: utf-8
2
+ require 'mongo'
3
+
4
+ module CarrierWave
5
+ module Storage
6
+
7
+ ##
8
+ # The GridFS store uses MongoDB's GridStore file storage system to store files
9
+ #
10
+ class GridFS < Abstract
11
+
12
+ class File
13
+
14
+ def initialize(uploader, path)
15
+ @path = path
16
+ @uploader = uploader
17
+ end
18
+
19
+ def path
20
+ nil
21
+ end
22
+
23
+ def url
24
+ unless @uploader.grid_fs_access_url
25
+ nil
26
+ else
27
+ [@uploader.grid_fs_access_url, @path].join("/")
28
+ end
29
+ end
30
+
31
+ def read
32
+ grid.open(@path, 'r').data
33
+ end
34
+
35
+ def write(file)
36
+ grid.open(@uploader.store_path, 'w', :content_type => file.content_type) do |f|
37
+ f.write(file.read)
38
+ end
39
+ end
40
+
41
+ def delete
42
+ grid.delete(@path)
43
+ end
44
+
45
+ def content_type
46
+ grid.open(@path, 'r').content_type
47
+ end
48
+
49
+ def file_length
50
+ grid.open(@path, 'r').file_length
51
+ end
52
+
53
+ protected
54
+
55
+ def database
56
+ @connection ||= begin
57
+ host = @uploader.grid_fs_host
58
+ port = @uploader.grid_fs_port
59
+ database = @uploader.grid_fs_database
60
+ username = @uploader.grid_fs_username
61
+ password = @uploader.grid_fs_password
62
+ db = Mongo::Connection.new(host, port).db(database)
63
+ db.authenticate(username, password) if username && password
64
+ db
65
+ end
66
+ end
67
+
68
+ def grid
69
+ @grid ||= Mongo::GridFileSystem.new(database)
70
+ end
71
+
72
+ end
73
+
74
+ ##
75
+ # Store the file in MongoDB's GridFS GridStore
76
+ #
77
+ # === Parameters
78
+ #
79
+ # [file (CarrierWave::SanitizedFile)] the file to store
80
+ #
81
+ # === Returns
82
+ #
83
+ # [CarrierWave::SanitizedFile] a sanitized file
84
+ #
85
+ def store!(file)
86
+ stored = CarrierWave::Storage::GridFS::File.new(uploader, uploader.store_path)
87
+ stored.write(file)
88
+ stored
89
+ end
90
+
91
+ ##
92
+ # Retrieve the file from MongoDB's GridFS GridStore
93
+ #
94
+ # === Parameters
95
+ #
96
+ # [identifier (String)] the filename of the file
97
+ #
98
+ # === Returns
99
+ #
100
+ # [CarrierWave::Storage::GridFS::File] a sanitized file
101
+ #
102
+ def retrieve!(identifier)
103
+ CarrierWave::Storage::GridFS::File.new(uploader, uploader.store_path(identifier))
104
+ end
105
+
106
+ end # File
107
+ end # Storage
108
+ end # CarrierWave
@@ -0,0 +1,3 @@
1
+
2
+ raise "The right_aws library is no longer supported. Please install the updated 'aws' library with support for Ruby 1.9 and euro buckets"
3
+
@@ -0,0 +1,206 @@
1
+ # encoding: utf-8
2
+ begin
3
+ require 'aws'
4
+ rescue LoadError
5
+ raise "You don't have the 'aws' gem installed. 'aws-s3' and 'right_aws' are no longer supported."
6
+ end
7
+
8
+ module CarrierWave
9
+ module Storage
10
+
11
+ ##
12
+ # Uploads things to Amazon S3 webservices using the "aws" library (aws gem).
13
+ # In order for CarrierWave to connect to Amazon S3, you'll need to specify an access key id, secret key
14
+ # and bucket
15
+ #
16
+ # CarrierWave.configure do |config|
17
+ # config.s3_access_key_id = "xxxxxx"
18
+ # config.s3_secret_access_key = "xxxxxx"
19
+ # config.s3_bucket = "my_bucket_name"
20
+ # end
21
+ #
22
+ # The AWS::S3Interface is used directly as opposed to the normal AWS::S3::Bucket et.al. classes.
23
+ # This gives much improved performance and avoids unnecessary requests.
24
+ #
25
+ # You can set the access policy for the uploaded files:
26
+ #
27
+ # CarrierWave.configure do |config|
28
+ # config.s3_access_policy = 'public-read'
29
+ # end
30
+ #
31
+ # The default is 'public-read'. For more options see:
32
+ #
33
+ # http://docs.amazonwebservices.com/AmazonS3/latest/RESTAccessPolicy.html#RESTCannedAccessPolicies
34
+ #
35
+ # For backwards compatability with the original aws-s3 library, if the old +config.s3_access+ is set it
36
+ # will be converted to the appropriate access policy:
37
+ #
38
+ # [:private] No one else has any access rights.
39
+ # [:public_read] The anonymous principal is granted READ access.
40
+ # If this policy is used on an object, it can be read from a
41
+ # browser with no authentication.
42
+ # [:public_read_write] The anonymous principal is granted READ and WRITE access.
43
+ # [:authenticated_read] Any principal authenticated as a registered Amazon S3 user
44
+ # is granted READ access.
45
+ #
46
+ # You can change the generated url to a cnamed domain by setting the cnamed config:
47
+ #
48
+ # CarrierWave.configure do |config|
49
+ # config.s3_cnamed = true
50
+ # config.s3_bucket = 'bucketname.domain.tld'
51
+ # end
52
+ #
53
+ # Now the resulting url will be
54
+ #
55
+ # http://bucketname.domain.tld/path/to/file
56
+ #
57
+ # instead of
58
+ #
59
+ # http://bucketname.domain.tld.s3.amazonaws.com/path/to/file
60
+ #
61
+ class S3 < Abstract
62
+
63
+ class File
64
+
65
+ def initialize(uploader, base, path)
66
+ @uploader = uploader
67
+ @path = path
68
+ @base = base
69
+ end
70
+
71
+ ##
72
+ # Returns the current path of the file on S3
73
+ #
74
+ # === Returns
75
+ #
76
+ # [String] A path
77
+ #
78
+ def path
79
+ @path
80
+ end
81
+
82
+ ##
83
+ # Reads the contents of the file from S3
84
+ #
85
+ # === Returns
86
+ #
87
+ # [String] contents of the file
88
+ #
89
+ def read
90
+ result = connection.get(bucket, @path)
91
+ @headers = result[:headers]
92
+ result[:object]
93
+ end
94
+
95
+ ##
96
+ # Remove the file from Amazon S3
97
+ #
98
+ def delete
99
+ connection.delete(bucket, @path)
100
+ end
101
+
102
+ ##
103
+ # Returns the url on Amazon's S3 service
104
+ #
105
+ # === Returns
106
+ #
107
+ # [String] file's url
108
+ #
109
+ def url
110
+ if @uploader.s3_cnamed
111
+ ["http://#{@uploader.s3_bucket}", @path].compact.join('/')
112
+ else
113
+ ["http://#{@uploader.s3_bucket}.s3.amazonaws.com", @path].compact.join('/')
114
+ end
115
+ end
116
+
117
+ def store(file)
118
+ content_type ||= file.content_type # this might cause problems if content type changes between read and upload (unlikely)
119
+ connection.put(bucket, @path, file.read,
120
+ {
121
+ 'x-amz-acl' => access_policy,
122
+ 'content-type' => content_type
123
+ }.merge(@uploader.s3_headers)
124
+ )
125
+ end
126
+
127
+ # The Amazon S3 Access policy ready to send in storage request headers.
128
+ def access_policy
129
+ return @access_policy unless @access_policy.blank?
130
+ if @uploader.s3_access_policy.blank?
131
+ if !@uploader.s3_access.blank?
132
+ @access_policy = @uploader.s3_access.to_s.gsub(/_/, '-')
133
+ else
134
+ @access_policy = 'public-read'
135
+ end
136
+ else
137
+ @access_policy = @uploader.s3_access_policy
138
+ end
139
+ end
140
+
141
+ def content_type
142
+ headers["content-type"]
143
+ end
144
+
145
+ def content_type=(type)
146
+ headers["content-type"] = type
147
+ end
148
+
149
+ # Headers returned from file retrieval
150
+ def headers
151
+ @headers ||= {}
152
+ end
153
+
154
+ private
155
+
156
+ def bucket
157
+ @uploader.s3_bucket
158
+ end
159
+
160
+ def connection
161
+ @base.connection
162
+ end
163
+
164
+ end
165
+
166
+ ##
167
+ # Store the file on S3
168
+ #
169
+ # === Parameters
170
+ #
171
+ # [file (CarrierWave::SanitizedFile)] the file to store
172
+ #
173
+ # === Returns
174
+ #
175
+ # [CarrierWave::Storage::RightS3::File] the stored file
176
+ #
177
+ def store!(file)
178
+ f = CarrierWave::Storage::S3::File.new(uploader, self, uploader.store_path)
179
+ f.store(file)
180
+ f
181
+ end
182
+
183
+ # Do something to retrieve the file
184
+ #
185
+ # @param [String] identifier uniquely identifies the file
186
+ #
187
+ # [identifier (String)] uniquely identifies the file
188
+ #
189
+ # === Returns
190
+ #
191
+ # [CarrierWave::Storage::RightS3::File] the stored file
192
+ #
193
+ def retrieve!(identifier)
194
+ CarrierWave::Storage::S3::File.new(uploader, self, uploader.store_path(identifier))
195
+ end
196
+
197
+ def connection
198
+ @connection ||= Aws::S3Interface.new(
199
+ uploader.s3_access_key_id, uploader.s3_secret_access_key,
200
+ :multi_thread => uploader.s3_multi_thread
201
+ )
202
+ end
203
+
204
+ end # S3
205
+ end # Storage
206
+ end # CarrierWave