httpimagestore 0.1.1 → 0.2.0
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.
- data/VERSION +1 -1
- data/bin/httpimagestore +10 -6
- data/features/httpimagestore.feature +19 -11
- data/httpimagestore.gemspec +2 -2
- data/lib/httpimagestore/pathname.rb +22 -8
- metadata +5 -5
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/bin/httpimagestore
CHANGED
@@ -105,13 +105,15 @@ sinatra.get '/' do
|
|
105
105
|
"hello"
|
106
106
|
end
|
107
107
|
|
108
|
-
sinatra.put %r{/thumbnail/([^/]*)
|
109
|
-
|
110
|
-
|
108
|
+
sinatra.put %r{/thumbnail/([^/]*)/?(.*)} do |classes, image_path|
|
109
|
+
if image_path.empty?
|
110
|
+
image_path = Pathname.new(image_path).extend(Pathname::AutoPath)
|
111
|
+
else
|
112
|
+
image_path = Pathname.new(image_path).extend(Pathname::CustomPath)
|
113
|
+
end
|
111
114
|
|
112
115
|
classes = classes.split(',').map{|tc| settings.thumbnail_classes[tc]}
|
113
116
|
image = request.body.read
|
114
|
-
image_hash = digest(image)
|
115
117
|
|
116
118
|
thumbs = $thumbnailer.thumbnail(image) do
|
117
119
|
classes.each do |tc|
|
@@ -126,11 +128,13 @@ sinatra.put %r{/thumbnail/([^/]*)/(.*)} do |classes, image_path|
|
|
126
128
|
|
127
129
|
urls = []
|
128
130
|
|
131
|
+
image_hash = digest(image)
|
132
|
+
|
129
133
|
# store all images
|
130
|
-
urls << $s3.put_image(image_path.original_image(image_hash).to_s, thumbs.input_mime_type, image)
|
134
|
+
urls << $s3.put_image(image_path.original_image(image_hash, thumbs.input_mime_type).to_s, thumbs.input_mime_type, image)
|
131
135
|
|
132
136
|
thumbs.zip(classes).each do |thumb, thumbnail_class|
|
133
|
-
urls << $s3.put_image(image_path.thumbnail_image(image_hash,
|
137
|
+
urls << $s3.put_image(image_path.thumbnail_image(image_hash, thumb.mime_type, thumbnail_class.name).to_s, thumb.mime_type, thumb.data)
|
134
138
|
end
|
135
139
|
|
136
140
|
status 200
|
@@ -22,6 +22,24 @@ Feature: Storing of original image and specified classes of its thumbnails on S3
|
|
22
22
|
Given issthumbtest S3 bucket with key AKIAJMUYVYOSACNXLPTQ and secret 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
|
23
23
|
|
24
24
|
Scenario: Putting original and its thumbnails to S3 bucket
|
25
|
+
Given there is no 4006450256177f4a.jpg file in S3 bucket
|
26
|
+
And there is no 4006450256177f4a/small.jpg file in S3 bucket
|
27
|
+
And there is no 4006450256177f4a/tiny.jpg file in S3 bucket
|
28
|
+
Given test.jpg file content as request body
|
29
|
+
When I do PUT request http://localhost:3000/thumbnail/small,tiny
|
30
|
+
Then response status will be 200
|
31
|
+
And response content type will be text/uri-list
|
32
|
+
And response body will be CRLF ended lines
|
33
|
+
"""
|
34
|
+
http://issthumbtest.s3.amazonaws.com/4006450256177f4a.jpg
|
35
|
+
http://issthumbtest.s3.amazonaws.com/4006450256177f4a/small.jpg
|
36
|
+
http://issthumbtest.s3.amazonaws.com/4006450256177f4a/tiny.jpg
|
37
|
+
"""
|
38
|
+
And http://issthumbtest.s3.amazonaws.com/4006450256177f4a.jpg will contain JPEG image of size 509x719
|
39
|
+
And http://issthumbtest.s3.amazonaws.com/4006450256177f4a/small.jpg will contain JPEG image of size 128x128
|
40
|
+
And http://issthumbtest.s3.amazonaws.com/4006450256177f4a/tiny.jpg will contain JPEG image of size 32x32
|
41
|
+
|
42
|
+
Scenario: Putting original and its thumbnails to S3 bucket under custom path
|
25
43
|
Given there is no test/image/4006450256177f4a/test.jpg file in S3 bucket
|
26
44
|
And there is no test/image/4006450256177f4a/test-small.jpg file in S3 bucket
|
27
45
|
And there is no test/image/4006450256177f4a/test-tiny.jpg file in S3 bucket
|
@@ -39,7 +57,7 @@ Feature: Storing of original image and specified classes of its thumbnails on S3
|
|
39
57
|
And http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test-small.jpg will contain JPEG image of size 128x128
|
40
58
|
And http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test-tiny.jpg will contain JPEG image of size 32x32
|
41
59
|
|
42
|
-
Scenario: Putting original and its thumbnails to S3 bucket with UTF characters (encoded) in the path and name
|
60
|
+
Scenario: Putting original and its thumbnails to S3 bucket under custom path with UTF characters (encoded) in the path and name
|
43
61
|
Given there is no test/图像/4006450256177f4a/测试.jpg file in S3 bucket
|
44
62
|
And there is no test/图像/4006450256177f4a/测试-small.jpg file in S3 bucket
|
45
63
|
Given test.jpg file content as request body
|
@@ -136,16 +154,6 @@ Feature: Storing of original image and specified classes of its thumbnails on S3
|
|
136
154
|
Error: Configuration::ThumbnailClassDoesNotExistError: Class 'bogous' does not exist
|
137
155
|
"""
|
138
156
|
|
139
|
-
Scenario: Handling of bad path
|
140
|
-
Given test.jpg file content as request body
|
141
|
-
When I do PUT request http://localhost:3000/thumbnail/small/
|
142
|
-
Then response status will be 400
|
143
|
-
And response content type will be text/plain
|
144
|
-
And response body will be CRLF ended lines like
|
145
|
-
"""
|
146
|
-
Error: BadRequestError: Path is empty
|
147
|
-
"""
|
148
|
-
|
149
157
|
Scenario: Too large image - uploaded image too big to fit in memory limit
|
150
158
|
Given test-large.jpg file content as request body
|
151
159
|
When I do PUT request http://localhost:3000/thumbnail/large_png/test/image/test.jpg
|
data/httpimagestore.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "httpimagestore"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jakub Pastuszek"]
|
12
|
-
s.date = "2012-01-
|
12
|
+
s.date = "2012-01-10"
|
13
13
|
s.description = "Thumbnails images using httpthumbnailer and stored data on HTTP server (S3)"
|
14
14
|
s.email = "jpastuszek@gmail.com"
|
15
15
|
s.executables = ["httpimagestore"]
|
@@ -1,19 +1,33 @@
|
|
1
1
|
require 'mime/types'
|
2
2
|
|
3
3
|
class Pathname
|
4
|
-
def
|
5
|
-
|
4
|
+
def mime_extension(mime_type)
|
5
|
+
mime = MIME::Types[mime_type].first or return extname
|
6
|
+
'.' + (mime.extensions.select{|e| e.length == 3}.first or mime.extensions.first)
|
6
7
|
end
|
7
8
|
|
8
|
-
|
9
|
-
|
9
|
+
module AutoPath
|
10
|
+
# <id>.<ext>
|
11
|
+
def original_image(id, mime_type)
|
12
|
+
"#{id.to_s}#{mime_extension(mime_type)}"
|
13
|
+
end
|
14
|
+
|
15
|
+
# <id>/<class>.<ext>
|
16
|
+
def thumbnail_image(id, mime_type, thumbnail_class)
|
17
|
+
"#{id.to_s}/#{thumbnail_class}#{mime_extension(mime_type)}"
|
18
|
+
end
|
10
19
|
end
|
11
20
|
|
12
|
-
|
21
|
+
module CustomPath
|
22
|
+
# abc/xyz.jpg => abc/<id>/xyz.jpg
|
23
|
+
def original_image(id, mime_type)
|
24
|
+
dirname + id.to_s + basename
|
25
|
+
end
|
13
26
|
|
14
|
-
|
15
|
-
|
16
|
-
|
27
|
+
# abc/xyz.jpg => abc/<id>/xyz-<class>.jpg
|
28
|
+
def thumbnail_image(id, mime_type, thumbnail_class)
|
29
|
+
dirname + id.to_s + "#{basename(extname)}-#{thumbnail_class}#{mime_extension(mime_type)}"
|
30
|
+
end
|
17
31
|
end
|
18
32
|
end
|
19
33
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: httpimagestore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jakub Pastuszek
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-01-
|
18
|
+
date: 2012-01-10 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
type: :runtime
|