attached 0.1.7 → 0.1.8
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -5
- data/lib/attached/attachment.rb +5 -4
- data/lib/attached/image.rb +46 -32
- data/lib/attached/storage.rb +4 -2
- data/lib/attached/storage/aws.rb +4 -4
- data/lib/attached/version.rb +3 -0
- metadata +6 -5
data/Gemfile
CHANGED
data/lib/attached/attachment.rb
CHANGED
@@ -36,6 +36,7 @@ module Attached
|
|
36
36
|
@options ||= {
|
37
37
|
:path => "/:name/:style/:identifier:extension",
|
38
38
|
:default => :original,
|
39
|
+
:medium => :aws,
|
39
40
|
:credentials => {},
|
40
41
|
:styles => {},
|
41
42
|
:processors => [],
|
@@ -110,14 +111,12 @@ module Attached
|
|
110
111
|
@file = file.respond_to?(:tempfile) ? file.tempfile : file
|
111
112
|
|
112
113
|
extension ||= File.extname(file.original_filename) if file.respond_to?(:original_filename)
|
113
|
-
extension ||= File.extname(file.path)
|
114
|
+
extension ||= File.extname(file.path) if file.respond_to?(:path)
|
114
115
|
|
115
116
|
instance_set :size, file.size
|
116
117
|
instance_set :extension, extension
|
117
118
|
instance_set :identifier, identifier
|
118
119
|
|
119
|
-
self.queue[self.default] = self.file
|
120
|
-
|
121
120
|
process
|
122
121
|
end
|
123
122
|
|
@@ -260,13 +259,15 @@ module Attached
|
|
260
259
|
|
261
260
|
private
|
262
261
|
|
263
|
-
# Helper function for calling processors.
|
262
|
+
# Helper function for calling processors (will queue default).
|
264
263
|
#
|
265
264
|
# Usage:
|
266
265
|
#
|
267
266
|
# self.process
|
268
267
|
|
269
268
|
def process
|
269
|
+
self.queue[self.default] = self.file
|
270
|
+
|
270
271
|
self.processors.each do |processor|
|
271
272
|
self.styles.each do |style, options|
|
272
273
|
case processor
|
data/lib/attached/image.rb
CHANGED
@@ -1,20 +1,16 @@
|
|
1
1
|
require 'attached/processor'
|
2
2
|
|
3
|
-
begin
|
4
|
-
require 'rmagick'
|
5
|
-
rescue LoadError
|
6
|
-
require 'RMagick'
|
7
|
-
rescue LoadError
|
8
|
-
raise "Installation of 'rmagick' is required before using the 'image' processor"
|
9
|
-
end
|
10
|
-
|
11
3
|
module Attached
|
12
4
|
|
13
5
|
class Image < Processor
|
14
6
|
|
15
7
|
|
16
8
|
attr_reader :path
|
17
|
-
attr_reader :
|
9
|
+
attr_reader :extension
|
10
|
+
|
11
|
+
attr_reader :width
|
12
|
+
attr_reader :height
|
13
|
+
attr_reader :operation
|
18
14
|
|
19
15
|
# Create a processor.
|
20
16
|
#
|
@@ -27,8 +23,24 @@ module Attached
|
|
27
23
|
def initialize(file, options = {}, attachment = nil)
|
28
24
|
super
|
29
25
|
|
30
|
-
@path
|
31
|
-
|
26
|
+
@path = self.file.path
|
27
|
+
|
28
|
+
@size = options[:size]
|
29
|
+
@extension = options[:extension]
|
30
|
+
|
31
|
+
@width, @height, @operation = @size.match(/(\d*)x?(\d*)(.*)/)[1..3] if @size
|
32
|
+
|
33
|
+
@width ||= options[:width]
|
34
|
+
@height ||= options[:height]
|
35
|
+
@operation ||= options[:operation]
|
36
|
+
|
37
|
+
@extension ||= File.extname(self.file.path)
|
38
|
+
|
39
|
+
@width = Integer(self.width)
|
40
|
+
@height = Integer(self.height)
|
41
|
+
|
42
|
+
raise "Image processor requires specification of 'width' or 'size'" unless self.width
|
43
|
+
raise "Image processor requires specification of 'height' or 'size'" unless self.height
|
32
44
|
end
|
33
45
|
|
34
46
|
|
@@ -39,32 +51,34 @@ module Attached
|
|
39
51
|
# self.process
|
40
52
|
|
41
53
|
def process
|
42
|
-
result = Tempfile.new(["",
|
54
|
+
result = Tempfile.new(["", self.extension])
|
43
55
|
result.binmode
|
44
|
-
|
45
|
-
image = ::Magick::Image.read(self.path)
|
46
|
-
image_list = ::Magick::ImageList.new
|
47
|
-
|
48
|
-
width, height, operation = self.options[:size].match(/\b(\d*)x?(\d*)\b([\#\<\>])?/)[1..3] if self.options[:size]
|
49
|
-
|
50
|
-
width ||= self.options[:width]
|
51
|
-
height ||= self.options[:height]
|
52
|
-
operation ||= self.options[:operation]
|
53
56
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
57
|
+
begin
|
58
|
+
parameters = []
|
59
|
+
|
60
|
+
parameters << self.path
|
61
|
+
|
58
62
|
case operation
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
else image_list << frame.resize(width, height)
|
63
|
+
when '#' then parameters << "-resize #{width}x#{height}^ -gravity center -extent #{width}x#{height}"
|
64
|
+
when '<' then parameters << "-resize #{width}x#{height}\\<"
|
65
|
+
when '>' then parameters << "-resize #{width}x#{height}\\>"
|
66
|
+
else parameters << "-resize #{width}x#{height}"
|
64
67
|
end
|
65
|
-
|
68
|
+
|
69
|
+
parameters << result.path
|
70
|
+
|
71
|
+
parameters = parameters.join(" ").squeeze(" ")
|
72
|
+
|
73
|
+
`convert #{parameters}`
|
74
|
+
|
75
|
+
raise "Command 'convert' failed. Ensure upload file is an image and options are correct." unless $?.exitstatus == 0
|
76
|
+
|
77
|
+
rescue Errno::ENOENT
|
78
|
+
|
79
|
+
raise "Command 'convert' not found. Ensure 'Image Magick' is installed."
|
66
80
|
|
67
|
-
|
81
|
+
end
|
68
82
|
|
69
83
|
return result
|
70
84
|
end
|
data/lib/attached/storage.rb
CHANGED
@@ -7,12 +7,14 @@ module Attached
|
|
7
7
|
#
|
8
8
|
# Usage:
|
9
9
|
#
|
10
|
-
# Attached::Storage.medium(
|
10
|
+
# Attached::Storage.medium()
|
11
|
+
# Attached::Storage.medium(:aws)
|
11
12
|
|
12
13
|
def self.storage(medium = :aws, credentials = nil)
|
13
14
|
|
14
15
|
case medium
|
15
|
-
when :aws then return Attached::Storage::AWS.new
|
16
|
+
when :aws then return Attached::Storage::AWS.new credentials
|
17
|
+
else raise "Undefined storage medium '#{medium}'."
|
16
18
|
end
|
17
19
|
|
18
20
|
end
|
data/lib/attached/storage/aws.rb
CHANGED
@@ -12,6 +12,7 @@ module Attached
|
|
12
12
|
class AWS < Base
|
13
13
|
|
14
14
|
|
15
|
+
attr_reader :access
|
15
16
|
attr_reader :bucket
|
16
17
|
attr_reader :access_key_id
|
17
18
|
attr_reader :secret_access_key
|
@@ -27,6 +28,7 @@ module Attached
|
|
27
28
|
def initialize(credentials)
|
28
29
|
credentials = parse(credentials)
|
29
30
|
|
31
|
+
@access = :public_read
|
30
32
|
@bucket = credentials[:bucket] || credentials['bucket']
|
31
33
|
@access_key_id = credentials[:access_key_id] || credentials['access_key_id']
|
32
34
|
@secret_access_key = credentials[:secret_access_key] || credentials['secret_access_key']
|
@@ -54,7 +56,7 @@ module Attached
|
|
54
56
|
def save(file, path)
|
55
57
|
connect()
|
56
58
|
begin
|
57
|
-
::AWS::S3::S3Object.store(path, file, bucket, :access =>
|
59
|
+
::AWS::S3::S3Object.store(path, file, bucket, :access => access)
|
58
60
|
rescue AWS::S3::NoSuchBucket => e
|
59
61
|
::AWS::S3::Bucket.create(bucket)
|
60
62
|
retry
|
@@ -71,10 +73,8 @@ module Attached
|
|
71
73
|
def destroy(path)
|
72
74
|
connect()
|
73
75
|
begin
|
74
|
-
::AWS::S3::S3Object.delete(path, bucket
|
76
|
+
::AWS::S3::S3Object.delete(path, bucket)
|
75
77
|
rescue AWS::S3::NoSuchBucket => e
|
76
|
-
::AWS::S3::Bucket.create(bucket)
|
77
|
-
retry
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 8
|
9
|
+
version: 0.1.8
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Kevin Sylvestre
|
@@ -14,11 +14,11 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-12-
|
17
|
+
date: 2010-12-22 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
21
|
+
name: aws-s3
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
none: false
|
@@ -31,7 +31,7 @@ dependencies:
|
|
31
31
|
type: :runtime
|
32
32
|
version_requirements: *id001
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
|
-
name:
|
34
|
+
name: guid
|
35
35
|
prerelease: false
|
36
36
|
requirement: &id002 !ruby/object:Gem::Requirement
|
37
37
|
none: false
|
@@ -60,6 +60,7 @@ files:
|
|
60
60
|
- lib/attached/storage/aws.rb
|
61
61
|
- lib/attached/storage/base.rb
|
62
62
|
- lib/attached/storage.rb
|
63
|
+
- lib/attached/version.rb
|
63
64
|
- lib/attached.rb
|
64
65
|
- lib/tasks/attached.rake
|
65
66
|
- README.rdoc
|