httpimagestore 0.0.10 → 0.1.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/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: