httpimagestore 0.0.10 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -3,9 +3,10 @@ source "http://rubygems.org"
3
3
  gem "sinatra", ">= 1.2.6"
4
4
  gem "mongrel", ">= 1.1.5"
5
5
  gem "s3", "~> 0.3"
6
- gem "httpthumbnailer-client", "~> 0.0.3"
6
+ gem "httpthumbnailer-client", "~> 0.1.0"
7
7
  gem "ruby-ip", "~> 0.9"
8
- gem "cli", "~> 0.0.3"
8
+ gem "cli", "~> 1.1.0"
9
+ gem "mime-types", "~> 1.17.2"
9
10
 
10
11
  # Add dependencies to develop your gem here.
11
12
  # Include everything needed to run rake, tests, features, etc.
@@ -17,6 +18,6 @@ group :development do
17
18
  gem "rcov", ">= 0"
18
19
  gem "rdoc", "~> 3.9"
19
20
  gem "daemon", "~> 1"
20
- gem "httpthumbnailer", "~> 0.0.8"
21
+ gem "httpthumbnailer", "~> 0.1.0"
21
22
  gem "prawn", "= 0.8.4"
22
23
  end
data/Gemfile.lock CHANGED
@@ -3,7 +3,7 @@ GEM
3
3
  specs:
4
4
  builder (3.0.0)
5
5
  cgi_multipart_eof_fix (2.5.0)
6
- cli (0.0.3)
6
+ cli (1.1.0)
7
7
  cucumber (1.1.3)
8
8
  builder (>= 2.1.2)
9
9
  diff-lcs (>= 1.1.2)
@@ -14,27 +14,27 @@ GEM
14
14
  daemons (1.1.4)
15
15
  diff-lcs (1.1.3)
16
16
  fastthread (1.0.7)
17
- fcgi (0.8.8)
18
17
  gem_plugin (0.2.3)
19
18
  gherkin (2.6.8)
20
19
  json (>= 1.4.6)
21
20
  git (1.2.5)
22
21
  haml (3.1.4)
23
- httpclient (2.2.3)
24
- httpthumbnailer (0.0.8)
25
- cli (~> 0.0)
26
- fcgi (~> 0.8)
22
+ httpclient (2.2.4)
23
+ httpthumbnailer (0.1.0)
24
+ cli (~> 1.1.0)
27
25
  haml (~> 3)
28
26
  mongrel (>= 1.1.5)
29
27
  rmagick (~> 2)
28
+ ruby-ip (~> 0.9)
30
29
  sinatra (>= 1.2.6)
31
- httpthumbnailer-client (0.0.3)
30
+ httpthumbnailer-client (0.1.0)
32
31
  httpclient (>= 2.2.1)
33
32
  jeweler (1.6.4)
34
33
  bundler (~> 1.0)
35
34
  git (>= 1.2.5)
36
35
  rake
37
36
  json (1.6.2)
37
+ mime-types (1.17.2)
38
38
  mongrel (1.1.5)
39
39
  cgi_multipart_eof_fix (>= 2.4)
40
40
  daemons (>= 1.0.3)
@@ -79,12 +79,13 @@ PLATFORMS
79
79
 
80
80
  DEPENDENCIES
81
81
  bundler (~> 1.0.0)
82
- cli (~> 0.0.3)
82
+ cli (~> 1.1.0)
83
83
  cucumber
84
84
  daemon (~> 1)
85
- httpthumbnailer (~> 0.0.8)
86
- httpthumbnailer-client (~> 0.0.3)
85
+ httpthumbnailer (~> 0.1.0)
86
+ httpthumbnailer-client (~> 0.1.0)
87
87
  jeweler (~> 1.6.4)
88
+ mime-types (~> 1.17.2)
88
89
  mongrel (>= 1.1.5)
89
90
  prawn (= 0.8.4)
90
91
  rcov
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.10
1
+ 0.1.0
data/bin/httpimagestore CHANGED
@@ -125,10 +125,10 @@ sinatra.put %r{/thumbnail/([^/]*)/(.*)} do |classes, image_path|
125
125
  urls = []
126
126
 
127
127
  # store all images
128
- urls << $s3.put_image(image_path.original_image(image_hash).to_s, response.headers['Content-Type'], image)
128
+ urls << $s3.put_image(image_path.original_image(image_hash).to_s, thumbs.input_mime_type, image)
129
129
 
130
130
  thumbs.zip(classes).each do |thumb, thumbnail_class|
131
- urls << $s3.put_image(image_path.thumbnail_image(image_hash, thumbnail_class.name).to_s, thumb.mime_type, thumb.data)
131
+ urls << $s3.put_image(image_path.thumbnail_image(image_hash, thumbnail_class.name, thumb.mime_type).to_s, thumb.mime_type, thumb.data)
132
132
  end
133
133
 
134
134
  status 200
@@ -12,8 +12,10 @@ Feature: Storing of original image and specified classes of its thumbnails on S3
12
12
 
13
13
  thumbnail_class 'small', 'crop', 128, 128
14
14
  thumbnail_class 'tiny', 'crop', 32, 32
15
+ thumbnail_class 'png', 'crop', 32, 32, 'PNG'
15
16
  thumbnail_class 'bad', 'crop', 0, 0
16
17
  thumbnail_class 'superlarge', 'crop', 16000, 16000
18
+ thumbnail_class 'large_png', 'crop', 7000, 7000, 'PNG'
17
19
  """
18
20
  Given httpthumbnailer log is empty
19
21
  Given httpthumbnailer server is running at http://localhost:3100/
@@ -37,6 +39,37 @@ Feature: Storing of original image and specified classes of its thumbnails on S3
37
39
  And http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test-small.jpg will contain JPEG image of size 128x128
38
40
  And http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test-tiny.jpg will contain JPEG image of size 32x32
39
41
 
42
+ Scenario: Input image content type determined from content
43
+ Given there is no test/image/4006450256177f4a/test.jpg file in S3 bucket
44
+ Given test.jpg file content as request body
45
+ And Content-Type header set to application/octet-stream
46
+ When I do PUT request http://localhost:3000/thumbnail/tiny/test/image/test.jpg
47
+ Then response status will be 200
48
+ And response content type will be text/uri-list
49
+ And response body will be CRLF ended lines
50
+ """
51
+ http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test.jpg
52
+ http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test-tiny.jpg
53
+ """
54
+ And http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test.jpg content type will be image/jpeg
55
+
56
+ Scenario: Thumbnail image content type and file extension determined from configured format
57
+ Given there is no test/image/4006450256177f4a/test.jpg file in S3 bucket
58
+ And there is no test/image/4006450256177f4a/test-tiny.jpg file in S3 bucket
59
+ And there is no test/image/4006450256177f4a/test-png.png file in S3 bucket
60
+ Given test.jpg file content as request body
61
+ When I do PUT request http://localhost:3000/thumbnail/tiny,png/test/image/test.jpg
62
+ Then response status will be 200
63
+ And response content type will be text/uri-list
64
+ And response body will be CRLF ended lines
65
+ """
66
+ http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test.jpg
67
+ http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test-tiny.jpg
68
+ http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test-png.png
69
+ """
70
+ And http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test-tiny.jpg content type will be image/jpeg
71
+ And http://issthumbtest.s3.amazonaws.com/test/image/4006450256177f4a/test-png.png content type will be image/png
72
+
40
73
  Scenario: Reporting of missing resource
41
74
  When I do GET request http://localhost:3000/blah
42
75
  Then response status will be 404
@@ -100,7 +133,7 @@ Feature: Storing of original image and specified classes of its thumbnails on S3
100
133
 
101
134
  Scenario: Too large image - uploaded image too big to fit in memory limit
102
135
  Given test-large.jpg file content as request body
103
- When I do PUT request http://localhost:3000/thumbnail/small/test/image/test.jpg
136
+ When I do PUT request http://localhost:3000/thumbnail/large_png/test/image/test.jpg
104
137
  Then response status will be 413
105
138
  And response content type will be text/plain
106
139
  And response body will be CRLF ended lines like
@@ -44,8 +44,13 @@ Given /there is no (.*) file in S3 bucket/ do |path|
44
44
  @bucket.objects.find(path).destroy rescue S3::Error::NoSuchKey
45
45
  end
46
46
 
47
+ Given /(.*) header set to (.*)/ do |header, value|
48
+ @request_headers ||= {}
49
+ @request_headers[header] = value
50
+ end
51
+
47
52
  When /I do (.*) request (.*)/ do |method, uri|
48
- @response = HTTPClient.new.request(method, uri, nil, @request_body)
53
+ @response = HTTPClient.new.request(method, uri, nil, @request_body, (@request_headers or {}))
49
54
  end
50
55
 
51
56
  Then /response status will be (.*)/ do |status|
@@ -67,6 +72,10 @@ Then /response body will be CRLF ended lines$/ do |body|
67
72
  @response.body.should == body.gsub("\n", "\r\n") + "\r\n"
68
73
  end
69
74
 
75
+ Then /(http.*) content type will be (.*)/ do |url, content_type|
76
+ get_headers(url)['Content-Type'].should == content_type
77
+ end
78
+
70
79
  Then /(.*) will contain (.*) image of size (.*)x(.*)/ do |url, format, width, height|
71
80
  data = get(url)
72
81
 
@@ -39,6 +39,10 @@ def get(url)
39
39
  HTTPClient.new.get_content(url)
40
40
  end
41
41
 
42
+ def get_headers(url)
43
+ HTTPClient.new.get(url).headers
44
+ end
45
+
42
46
  def start_server(cmd, pid_file, log_file, test_url)
43
47
  stop_server(pid_file)
44
48
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "httpimagestore"
8
- s.version = "0.0.10"
8
+ s.version = "0.1.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 = "2011-12-01"
12
+ s.date = "2012-01-04"
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"]
@@ -55,9 +55,10 @@ Gem::Specification.new do |s|
55
55
  s.add_runtime_dependency(%q<sinatra>, [">= 1.2.6"])
56
56
  s.add_runtime_dependency(%q<mongrel>, [">= 1.1.5"])
57
57
  s.add_runtime_dependency(%q<s3>, ["~> 0.3"])
58
- s.add_runtime_dependency(%q<httpthumbnailer-client>, ["~> 0.0.3"])
58
+ s.add_runtime_dependency(%q<httpthumbnailer-client>, ["~> 0.1.0"])
59
59
  s.add_runtime_dependency(%q<ruby-ip>, ["~> 0.9"])
60
- s.add_runtime_dependency(%q<cli>, ["~> 0.0.3"])
60
+ s.add_runtime_dependency(%q<cli>, ["~> 1.1.0"])
61
+ s.add_runtime_dependency(%q<mime-types>, ["~> 1.17.2"])
61
62
  s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
62
63
  s.add_development_dependency(%q<cucumber>, [">= 0"])
63
64
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
@@ -65,15 +66,16 @@ Gem::Specification.new do |s|
65
66
  s.add_development_dependency(%q<rcov>, [">= 0"])
66
67
  s.add_development_dependency(%q<rdoc>, ["~> 3.9"])
67
68
  s.add_development_dependency(%q<daemon>, ["~> 1"])
68
- s.add_development_dependency(%q<httpthumbnailer>, ["~> 0.0.8"])
69
+ s.add_development_dependency(%q<httpthumbnailer>, ["~> 0.1.0"])
69
70
  s.add_development_dependency(%q<prawn>, ["= 0.8.4"])
70
71
  else
71
72
  s.add_dependency(%q<sinatra>, [">= 1.2.6"])
72
73
  s.add_dependency(%q<mongrel>, [">= 1.1.5"])
73
74
  s.add_dependency(%q<s3>, ["~> 0.3"])
74
- s.add_dependency(%q<httpthumbnailer-client>, ["~> 0.0.3"])
75
+ s.add_dependency(%q<httpthumbnailer-client>, ["~> 0.1.0"])
75
76
  s.add_dependency(%q<ruby-ip>, ["~> 0.9"])
76
- s.add_dependency(%q<cli>, ["~> 0.0.3"])
77
+ s.add_dependency(%q<cli>, ["~> 1.1.0"])
78
+ s.add_dependency(%q<mime-types>, ["~> 1.17.2"])
77
79
  s.add_dependency(%q<rspec>, ["~> 2.3.0"])
78
80
  s.add_dependency(%q<cucumber>, [">= 0"])
79
81
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
@@ -81,16 +83,17 @@ Gem::Specification.new do |s|
81
83
  s.add_dependency(%q<rcov>, [">= 0"])
82
84
  s.add_dependency(%q<rdoc>, ["~> 3.9"])
83
85
  s.add_dependency(%q<daemon>, ["~> 1"])
84
- s.add_dependency(%q<httpthumbnailer>, ["~> 0.0.8"])
86
+ s.add_dependency(%q<httpthumbnailer>, ["~> 0.1.0"])
85
87
  s.add_dependency(%q<prawn>, ["= 0.8.4"])
86
88
  end
87
89
  else
88
90
  s.add_dependency(%q<sinatra>, [">= 1.2.6"])
89
91
  s.add_dependency(%q<mongrel>, [">= 1.1.5"])
90
92
  s.add_dependency(%q<s3>, ["~> 0.3"])
91
- s.add_dependency(%q<httpthumbnailer-client>, ["~> 0.0.3"])
93
+ s.add_dependency(%q<httpthumbnailer-client>, ["~> 0.1.0"])
92
94
  s.add_dependency(%q<ruby-ip>, ["~> 0.9"])
93
- s.add_dependency(%q<cli>, ["~> 0.0.3"])
95
+ s.add_dependency(%q<cli>, ["~> 1.1.0"])
96
+ s.add_dependency(%q<mime-types>, ["~> 1.17.2"])
94
97
  s.add_dependency(%q<rspec>, ["~> 2.3.0"])
95
98
  s.add_dependency(%q<cucumber>, [">= 0"])
96
99
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
@@ -98,7 +101,7 @@ Gem::Specification.new do |s|
98
101
  s.add_dependency(%q<rcov>, [">= 0"])
99
102
  s.add_dependency(%q<rdoc>, ["~> 3.9"])
100
103
  s.add_dependency(%q<daemon>, ["~> 1"])
101
- s.add_dependency(%q<httpthumbnailer>, ["~> 0.0.8"])
104
+ s.add_dependency(%q<httpthumbnailer>, ["~> 0.1.0"])
102
105
  s.add_dependency(%q<prawn>, ["= 0.8.4"])
103
106
  end
104
107
  end
@@ -1,10 +1,19 @@
1
+ require 'mime/types'
2
+
1
3
  class Pathname
2
4
  def original_image(id)
3
5
  dirname + id.to_s + basename
4
6
  end
5
7
 
6
- def thumbnail_image(id, thumbnail_class)
7
- dirname + id.to_s + "#{basename(extname)}-#{thumbnail_class}#{extname}"
8
+ def thumbnail_image(id, thumbnail_class, mime_type)
9
+ dirname + id.to_s + "#{basename(extname)}-#{thumbnail_class}#{mime_extension(mime_type) or extname}"
10
+ end
11
+
12
+ private
13
+
14
+ def mime_extension(mime_type)
15
+ mime = MIME::Types[mime_type].first or return nil
16
+ '.' + (mime.extensions.select{|e| e.length == 3}.first or mime.extensions.first)
8
17
  end
9
18
  end
10
19
 
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: 11
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 10
10
- version: 0.0.10
10
+ version: 0.1.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: 2011-12-01 00:00:00 Z
18
+ date: 2012-01-04 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  type: :runtime
@@ -71,12 +71,12 @@ dependencies:
71
71
  requirements:
72
72
  - - ~>
73
73
  - !ruby/object:Gem::Version
74
- hash: 25
74
+ hash: 27
75
75
  segments:
76
76
  - 0
77
+ - 1
77
78
  - 0
78
- - 3
79
- version: 0.0.3
79
+ version: 0.1.0
80
80
  prerelease: false
81
81
  name: httpthumbnailer-client
82
82
  version_requirements: *id004
@@ -102,18 +102,34 @@ dependencies:
102
102
  requirements:
103
103
  - - ~>
104
104
  - !ruby/object:Gem::Version
105
- hash: 25
105
+ hash: 19
106
106
  segments:
107
+ - 1
108
+ - 1
107
109
  - 0
108
- - 0
109
- - 3
110
- version: 0.0.3
110
+ version: 1.1.0
111
111
  prerelease: false
112
112
  name: cli
113
113
  version_requirements: *id006
114
114
  - !ruby/object:Gem::Dependency
115
- type: :development
115
+ type: :runtime
116
116
  requirement: &id007 !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ~>
120
+ - !ruby/object:Gem::Version
121
+ hash: 87
122
+ segments:
123
+ - 1
124
+ - 17
125
+ - 2
126
+ version: 1.17.2
127
+ prerelease: false
128
+ name: mime-types
129
+ version_requirements: *id007
130
+ - !ruby/object:Gem::Dependency
131
+ type: :development
132
+ requirement: &id008 !ruby/object:Gem::Requirement
117
133
  none: false
118
134
  requirements:
119
135
  - - ~>
@@ -126,10 +142,10 @@ dependencies:
126
142
  version: 2.3.0
127
143
  prerelease: false
128
144
  name: rspec
129
- version_requirements: *id007
145
+ version_requirements: *id008
130
146
  - !ruby/object:Gem::Dependency
131
147
  type: :development
132
- requirement: &id008 !ruby/object:Gem::Requirement
148
+ requirement: &id009 !ruby/object:Gem::Requirement
133
149
  none: false
134
150
  requirements:
135
151
  - - ">="
@@ -140,10 +156,10 @@ dependencies:
140
156
  version: "0"
141
157
  prerelease: false
142
158
  name: cucumber
143
- version_requirements: *id008
159
+ version_requirements: *id009
144
160
  - !ruby/object:Gem::Dependency
145
161
  type: :development
146
- requirement: &id009 !ruby/object:Gem::Requirement
162
+ requirement: &id010 !ruby/object:Gem::Requirement
147
163
  none: false
148
164
  requirements:
149
165
  - - ~>
@@ -156,10 +172,10 @@ dependencies:
156
172
  version: 1.0.0
157
173
  prerelease: false
158
174
  name: bundler
159
- version_requirements: *id009
175
+ version_requirements: *id010
160
176
  - !ruby/object:Gem::Dependency
161
177
  type: :development
162
- requirement: &id010 !ruby/object:Gem::Requirement
178
+ requirement: &id011 !ruby/object:Gem::Requirement
163
179
  none: false
164
180
  requirements:
165
181
  - - ~>
@@ -172,10 +188,10 @@ dependencies:
172
188
  version: 1.6.4
173
189
  prerelease: false
174
190
  name: jeweler
175
- version_requirements: *id010
191
+ version_requirements: *id011
176
192
  - !ruby/object:Gem::Dependency
177
193
  type: :development
178
- requirement: &id011 !ruby/object:Gem::Requirement
194
+ requirement: &id012 !ruby/object:Gem::Requirement
179
195
  none: false
180
196
  requirements:
181
197
  - - ">="
@@ -186,10 +202,10 @@ dependencies:
186
202
  version: "0"
187
203
  prerelease: false
188
204
  name: rcov
189
- version_requirements: *id011
205
+ version_requirements: *id012
190
206
  - !ruby/object:Gem::Dependency
191
207
  type: :development
192
- requirement: &id012 !ruby/object:Gem::Requirement
208
+ requirement: &id013 !ruby/object:Gem::Requirement
193
209
  none: false
194
210
  requirements:
195
211
  - - ~>
@@ -201,10 +217,10 @@ dependencies:
201
217
  version: "3.9"
202
218
  prerelease: false
203
219
  name: rdoc
204
- version_requirements: *id012
220
+ version_requirements: *id013
205
221
  - !ruby/object:Gem::Dependency
206
222
  type: :development
207
- requirement: &id013 !ruby/object:Gem::Requirement
223
+ requirement: &id014 !ruby/object:Gem::Requirement
208
224
  none: false
209
225
  requirements:
210
226
  - - ~>
@@ -215,26 +231,26 @@ dependencies:
215
231
  version: "1"
216
232
  prerelease: false
217
233
  name: daemon
218
- version_requirements: *id013
234
+ version_requirements: *id014
219
235
  - !ruby/object:Gem::Dependency
220
236
  type: :development
221
- requirement: &id014 !ruby/object:Gem::Requirement
237
+ requirement: &id015 !ruby/object:Gem::Requirement
222
238
  none: false
223
239
  requirements:
224
240
  - - ~>
225
241
  - !ruby/object:Gem::Version
226
- hash: 15
242
+ hash: 27
227
243
  segments:
228
244
  - 0
245
+ - 1
229
246
  - 0
230
- - 8
231
- version: 0.0.8
247
+ version: 0.1.0
232
248
  prerelease: false
233
249
  name: httpthumbnailer
234
- version_requirements: *id014
250
+ version_requirements: *id015
235
251
  - !ruby/object:Gem::Dependency
236
252
  type: :development
237
- requirement: &id015 !ruby/object:Gem::Requirement
253
+ requirement: &id016 !ruby/object:Gem::Requirement
238
254
  none: false
239
255
  requirements:
240
256
  - - "="
@@ -247,7 +263,7 @@ dependencies:
247
263
  version: 0.8.4
248
264
  prerelease: false
249
265
  name: prawn
250
- version_requirements: *id015
266
+ version_requirements: *id016
251
267
  description: Thumbnails images using httpthumbnailer and stored data on HTTP server (S3)
252
268
  email: jpastuszek@gmail.com
253
269
  executables: