httpthumbnailer 1.2.0 → 1.3.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.
Files changed (57) hide show
  1. checksums.yaml +15 -0
  2. data/Gemfile +4 -3
  3. data/Gemfile.lock +12 -12
  4. data/README.md +242 -68
  5. data/Rakefile +8 -2
  6. data/VERSION +1 -1
  7. data/bin/httpthumbnailer +35 -7
  8. data/lib/httpthumbnailer/error_reporter.rb +4 -2
  9. data/lib/httpthumbnailer/ownership.rb +54 -0
  10. data/lib/httpthumbnailer/plugin.rb +87 -0
  11. data/lib/httpthumbnailer/plugin/thumbnailer.rb +22 -427
  12. data/lib/httpthumbnailer/plugin/thumbnailer/service.rb +163 -0
  13. data/lib/httpthumbnailer/plugin/thumbnailer/service/built_in_plugins.rb +134 -0
  14. data/lib/httpthumbnailer/plugin/thumbnailer/service/images.rb +295 -0
  15. data/lib/httpthumbnailer/plugin/thumbnailer/service/magick.rb +208 -0
  16. data/lib/httpthumbnailer/thumbnail_specs.rb +130 -37
  17. data/lib/httpthumbnailer/thumbnailer.rb +29 -11
  18. metadata +30 -81
  19. data/.rspec +0 -1
  20. data/features/httpthumbnailer.feature +0 -24
  21. data/features/identify.feature +0 -31
  22. data/features/step_definitions/httpthumbnailer_steps.rb +0 -159
  23. data/features/support/env.rb +0 -106
  24. data/features/support/test-large.jpg +0 -0
  25. data/features/support/test-transparent.png +0 -0
  26. data/features/support/test.jpg +0 -0
  27. data/features/support/test.png +0 -0
  28. data/features/support/test.txt +0 -1
  29. data/features/thumbnail.feature +0 -269
  30. data/features/thumbnails.feature +0 -158
  31. data/httpthumbnailer.gemspec +0 -121
  32. data/load_test/extralarge.jpg +0 -0
  33. data/load_test/large.jpg +0 -0
  34. data/load_test/large.png +0 -0
  35. data/load_test/load_test-374846090-1.1.0-rc1-identify-only.csv +0 -3
  36. data/load_test/load_test-374846090-1.1.0-rc1.csv +0 -11
  37. data/load_test/load_test-cd9679c.csv +0 -10
  38. data/load_test/load_test-v0.3.1.csv +0 -10
  39. data/load_test/load_test.jmx +0 -733
  40. data/load_test/medium.jpg +0 -0
  41. data/load_test/small.jpg +0 -0
  42. data/load_test/soak_test-ac0c6bcbe5e-broken-libjpeg-tatoos.csv +0 -11
  43. data/load_test/soak_test-cd9679c.csv +0 -10
  44. data/load_test/soak_test-f98334a-tatoos.csv +0 -11
  45. data/load_test/soak_test.jmx +0 -754
  46. data/load_test/tiny.jpg +0 -0
  47. data/load_test/v0.0.13-loading.csv +0 -7
  48. data/load_test/v0.0.13.csv +0 -7
  49. data/load_test/v0.0.14-no-optimization.csv +0 -10
  50. data/load_test/v0.0.14.csv +0 -10
  51. data/spec/image_processing_spec.rb +0 -148
  52. data/spec/plugin_thumbnailer_spec.rb +0 -318
  53. data/spec/spec_helper.rb +0 -14
  54. data/spec/support/square_even.png +0 -0
  55. data/spec/support/square_odd.png +0 -0
  56. data/spec/support/test_image.rb +0 -16
  57. data/spec/thumbnail_specs_spec.rb +0 -43
metadata CHANGED
@@ -1,36 +1,32 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: httpthumbnailer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
5
- prerelease:
4
+ version: 1.3.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Jakub Pastuszek
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-07-28 00:00:00.000000000 Z
11
+ date: 2015-06-17 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: unicorn-cuba-base
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
21
- version: 1.2.0
19
+ version: '1.6'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
29
- version: 1.2.0
26
+ version: '1.6'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rmagick
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ~>
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ~>
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rspec-mocks
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ~>
76
67
  - !ruby/object:Gem::Version
@@ -78,23 +69,20 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: cucumber
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - ~>
84
74
  - !ruby/object:Gem::Version
85
- version: '0'
75
+ version: '1.3'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - ~>
92
81
  - !ruby/object:Gem::Version
93
- version: '0'
82
+ version: '1.3'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: capybara
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ~>
100
88
  - !ruby/object:Gem::Version
@@ -102,7 +90,6 @@ dependencies:
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ~>
108
95
  - !ruby/object:Gem::Version
@@ -110,23 +97,26 @@ dependencies:
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: jeweler
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ~>
101
+ - - ! '>='
116
102
  - !ruby/object:Gem::Version
117
103
  version: 1.8.8
104
+ - - ~>
105
+ - !ruby/object:Gem::Version
106
+ version: '1.8'
118
107
  type: :development
119
108
  prerelease: false
120
109
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
110
  requirements:
123
- - - ~>
111
+ - - ! '>='
124
112
  - !ruby/object:Gem::Version
125
113
  version: 1.8.8
114
+ - - ~>
115
+ - !ruby/object:Gem::Version
116
+ version: '1.8'
126
117
  - !ruby/object:Gem::Dependency
127
118
  name: httpclient
128
119
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
120
  requirements:
131
121
  - - ~>
132
122
  - !ruby/object:Gem::Version
@@ -134,7 +124,6 @@ dependencies:
134
124
  type: :development
135
125
  prerelease: false
136
126
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
127
  requirements:
139
128
  - - ~>
140
129
  - !ruby/object:Gem::Version
@@ -142,7 +131,6 @@ dependencies:
142
131
  - !ruby/object:Gem::Dependency
143
132
  name: rdoc
144
133
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
134
  requirements:
147
135
  - - ~>
148
136
  - !ruby/object:Gem::Version
@@ -150,7 +138,6 @@ dependencies:
150
138
  type: :development
151
139
  prerelease: false
152
140
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
141
  requirements:
155
142
  - - ~>
156
143
  - !ruby/object:Gem::Version
@@ -158,7 +145,6 @@ dependencies:
158
145
  - !ruby/object:Gem::Dependency
159
146
  name: multipart-parser
160
147
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
148
  requirements:
163
149
  - - ~>
164
150
  - !ruby/object:Gem::Version
@@ -166,7 +152,6 @@ dependencies:
166
152
  type: :development
167
153
  prerelease: false
168
154
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
155
  requirements:
171
156
  - - ~>
172
157
  - !ruby/object:Gem::Version
@@ -174,7 +159,6 @@ dependencies:
174
159
  - !ruby/object:Gem::Dependency
175
160
  name: daemon
176
161
  requirement: !ruby/object:Gem::Requirement
177
- none: false
178
162
  requirements:
179
163
  - - ~>
180
164
  - !ruby/object:Gem::Version
@@ -182,12 +166,14 @@ dependencies:
182
166
  type: :development
183
167
  prerelease: false
184
168
  version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
169
  requirements:
187
170
  - - ~>
188
171
  - !ruby/object:Gem::Version
189
172
  version: '1.1'
190
- description: Provides HTTP API for thumbnailing images
173
+ description: Statless HTTP server that provides API for thumbnailing images with different
174
+ aspect ratio keeping methods, applying image edits (like rotate, crop, blur, pixelate,
175
+ etc.), identification of image format and size and more. It is using ImageMagick
176
+ or GraphicsMagick via RMagick gem as the image processing library.
191
177
  email: jpastuszek@gmail.com
192
178
  executables:
193
179
  - httpthumbnailer
@@ -197,7 +183,6 @@ extra_rdoc_files:
197
183
  - README.md
198
184
  files:
199
185
  - .document
200
- - .rspec
201
186
  - Gemfile
202
187
  - Gemfile.lock
203
188
  - LICENSE.txt
@@ -205,74 +190,38 @@ files:
205
190
  - Rakefile
206
191
  - VERSION
207
192
  - bin/httpthumbnailer
208
- - features/httpthumbnailer.feature
209
- - features/identify.feature
210
- - features/step_definitions/httpthumbnailer_steps.rb
211
- - features/support/env.rb
212
- - features/support/test-large.jpg
213
- - features/support/test-transparent.png
214
- - features/support/test.jpg
215
- - features/support/test.png
216
- - features/support/test.txt
217
- - features/thumbnail.feature
218
- - features/thumbnails.feature
219
- - httpthumbnailer.gemspec
220
193
  - lib/httpthumbnailer/error_reporter.rb
194
+ - lib/httpthumbnailer/ownership.rb
195
+ - lib/httpthumbnailer/plugin.rb
221
196
  - lib/httpthumbnailer/plugin/thumbnailer.rb
197
+ - lib/httpthumbnailer/plugin/thumbnailer/service.rb
198
+ - lib/httpthumbnailer/plugin/thumbnailer/service/built_in_plugins.rb
199
+ - lib/httpthumbnailer/plugin/thumbnailer/service/images.rb
200
+ - lib/httpthumbnailer/plugin/thumbnailer/service/magick.rb
222
201
  - lib/httpthumbnailer/thumbnail_specs.rb
223
202
  - lib/httpthumbnailer/thumbnailer.rb
224
- - load_test/extralarge.jpg
225
- - load_test/large.jpg
226
- - load_test/large.png
227
- - load_test/load_test-374846090-1.1.0-rc1-identify-only.csv
228
- - load_test/load_test-374846090-1.1.0-rc1.csv
229
- - load_test/load_test-cd9679c.csv
230
- - load_test/load_test-v0.3.1.csv
231
- - load_test/load_test.jmx
232
- - load_test/medium.jpg
233
- - load_test/small.jpg
234
- - load_test/soak_test-ac0c6bcbe5e-broken-libjpeg-tatoos.csv
235
- - load_test/soak_test-cd9679c.csv
236
- - load_test/soak_test-f98334a-tatoos.csv
237
- - load_test/soak_test.jmx
238
- - load_test/tiny.jpg
239
- - load_test/v0.0.13-loading.csv
240
- - load_test/v0.0.13.csv
241
- - load_test/v0.0.14-no-optimization.csv
242
- - load_test/v0.0.14.csv
243
- - spec/image_processing_spec.rb
244
- - spec/plugin_thumbnailer_spec.rb
245
- - spec/spec_helper.rb
246
- - spec/support/square_even.png
247
- - spec/support/square_odd.png
248
- - spec/support/test_image.rb
249
- - spec/thumbnail_specs_spec.rb
250
203
  homepage: http://github.com/jpastuszek/httpthumbnailer
251
204
  licenses:
252
205
  - MIT
206
+ metadata: {}
253
207
  post_install_message:
254
208
  rdoc_options: []
255
209
  require_paths:
256
210
  - lib
257
211
  required_ruby_version: !ruby/object:Gem::Requirement
258
- none: false
259
212
  requirements:
260
213
  - - ! '>='
261
214
  - !ruby/object:Gem::Version
262
215
  version: '0'
263
- segments:
264
- - 0
265
- hash: -2315585188832359526
266
216
  required_rubygems_version: !ruby/object:Gem::Requirement
267
- none: false
268
217
  requirements:
269
218
  - - ! '>='
270
219
  - !ruby/object:Gem::Version
271
220
  version: '0'
272
221
  requirements: []
273
222
  rubyforge_project:
274
- rubygems_version: 1.8.23
223
+ rubygems_version: 2.4.7
275
224
  signing_key:
276
- specification_version: 3
277
- summary: HTTP thumbnailing server
225
+ specification_version: 4
226
+ summary: HTTP API server for image thumbnailing, editing and format conversion
278
227
  test_files: []
data/.rspec DELETED
@@ -1 +0,0 @@
1
- --color
@@ -1,24 +0,0 @@
1
- Feature: HTTP server
2
- It should behave like valid HTTP server
3
-
4
- Background:
5
- Given httpthumbnailer server is running at http://localhost:3100/
6
-
7
- Scenario: Reporitng of missing resource for GET
8
- When I do GET request http://localhost:3100/blah
9
- Then response status should be 404
10
- And response content type should be text/plain
11
- And response body should be CRLF endend lines
12
- """
13
- request for URI '/blah' was not handled by the server
14
- """
15
-
16
- Scenario: Reporitng of missing resource for PUT
17
- When I do PUT request http://localhost:3100/blah/thumbnails/crop,0,0,PNG/fit,0,0,JPG/pad,0,0,JPEG
18
- Then response status should be 404
19
- And response content type should be text/plain
20
- And response body should be CRLF endend lines
21
- """
22
- request for URI '/blah/thumbnails/crop,0,0,PNG/fit,0,0,JPG/pad,0,0,JPEG' was not handled by the server
23
- """
24
-
@@ -1,31 +0,0 @@
1
- Feature: Identify API endpoint
2
- Identify API allows for image identification.
3
-
4
- Background:
5
- Given httpthumbnailer server is running at http://localhost:3100/
6
-
7
- @identify
8
- Scenario: Identifying of image mime type
9
- Given test.jpg file content as request body
10
- When I do PUT request http://localhost:3100/identify
11
- Then response status should be 200
12
- And response content type should be application/json
13
- And response body should be JSON encoded
14
- And response JSON should contain key mimeType of value image/jpeg
15
- Given test.png file content as request body
16
- When I do PUT request http://localhost:3100/identify
17
- Then response status should be 200
18
- And response content type should be application/json
19
- And response body should be JSON encoded
20
- And response JSON should contain key mimeType of value image/png
21
-
22
- @identify
23
- Scenario: Identifying of image width and height
24
- Given test-large.jpg file content as request body
25
- When I do PUT request http://localhost:3100/identify
26
- Then response status should be 200
27
- And response content type should be application/json
28
- And response body should be JSON encoded
29
- And response JSON should contain key width of integer value 9911
30
- And response JSON should contain key height of integer value 14000
31
-
@@ -1,159 +0,0 @@
1
- Given /httpthumbnailer server is running at (.*)/ do |url|
2
- log = support_dir + 'server.log'
3
- cmd = "bundle exec #{script('httpthumbnailer')} -f -d -l #{log} -w 1"
4
- start_server(cmd, '/tmp/httpthumbnailer.pid', log, url)
5
- end
6
-
7
- Given /(.*) file content as request body/ do |file|
8
- @request_body = File.open(support_dir + file){|f| f.read }
9
- end
10
-
11
- When /I do (.*) request (.*)/ do |method, url|
12
- @response = http_client.request(method, url, nil, @request_body)
13
- end
14
-
15
- When /I save response body/ do
16
- @saved_response_body = @response.body
17
- end
18
-
19
- Then /^([^ ]+) header should be (.*)/ do |header, value|
20
- @response.header[header].should_not be_empty
21
- @response.header[header].first.should == value
22
- end
23
-
24
- Then /I should get multipart response/ do
25
- @response.header['Content-Type'].first.should match /^multipart/
26
- parser = MultipartParser::Reader.new(MultipartParser::Reader.extract_boundary_value(@response.header['Content-Type'].last))
27
- @response_multipart = []
28
-
29
- parser.on_part do |part|
30
- part_struct = OpenStruct.new
31
- part_struct.headers = part.headers
32
-
33
- part_struct.body = ''
34
- part.on_data do |data|
35
- part_struct.body << data
36
- end
37
-
38
- part.on_end do
39
- @response_multipart << part_struct
40
- end
41
- end
42
-
43
- parser.write @response.body
44
-
45
- parser.ended?.should be_true
46
- @response_multipart.should_not be_empty
47
- end
48
-
49
- Then /response body should be CRLF endend lines like/ do |body|
50
- @response.body.should match(body)
51
- @response.body.each_line do |line|
52
- line[-2,2].should == "\r\n"
53
- end
54
- end
55
-
56
- Then /response body should be CRLF endend lines$/ do |body|
57
- @response.body.should == body.gsub("\n", "\r\n") + "\r\n"
58
- end
59
-
60
- Then /response status should be (.*)/ do |status|
61
- @response.status.should == status.to_i
62
- end
63
-
64
- Then /response content type should be (.*)/ do |content_type|
65
- @response.header['Content-Type'].first.should == content_type
66
- end
67
-
68
- Then /response mime type should be (.*)/ do |mime_type|
69
- step "response content type should be #{mime_type}"
70
- end
71
-
72
- Then /^([^ ]+) part (.*) header should be (.*)/ do |part, header, value|
73
- @response_multipart[part_no(part)].headers[header.downcase].should == value
74
- end
75
-
76
- Then /^([^ ]+) part body should be CRLF endend lines$/ do |part, body|
77
- @response_multipart[part_no(part)].body.should == body.gsub("\n", "\r\n")
78
- end
79
-
80
- Then /^([^ ]+) part body should be CRLF endend lines like$/ do |part, body|
81
- pbody = @response_multipart[part_no(part)].body
82
- pbody.should match(body)
83
- end
84
-
85
- Then /response should contain (.*) image of size (.*)x(.*)/ do |format, width, height|
86
- mime = @response.header['Content-Type'].first
87
- data = @response.body
88
- fail("expecte image got #{mime}: #{data}") unless mime =~ /^image\//
89
-
90
- @image.destroy! if @image
91
- @image = Magick::Image.from_blob(data).first
92
-
93
- @image.format.should == format
94
- @image.columns.should == width.to_i
95
- @image.rows.should == height.to_i
96
- end
97
-
98
-
99
- Then /(.*) part should contain (.*) image of size (.*)x(.*)/ do |part, format, width, height|
100
- mime = @response_multipart[part_no(part)].headers['content-type']
101
- data = @response_multipart[part_no(part)].body
102
-
103
- mime.should match /^image\//
104
- data.should_not be_empty
105
-
106
- @image.destroy! if @image
107
- @image = Magick::Image.from_blob(data).first
108
-
109
- @image.format.should == format
110
- @image.columns.should == width.to_i
111
- @image.rows.should == height.to_i
112
- end
113
-
114
- Then /saved response body will be smaller than response body/ do
115
- @saved_response_body.length.should < @response.body.length
116
- end
117
-
118
- And /response will be saved as (.*) for human inspection/ do |file|
119
- data = @response.body
120
- (support_dir + file).open('w'){|f| f.write(data)}
121
- end
122
-
123
- And /(.*) part body will be saved as (.*) for human inspection/ do |part, file|
124
- data = @response_multipart[part_no(part)].body
125
- (support_dir + file).open('w'){|f| f.write(data)}
126
- end
127
-
128
- And /that image pixel at (.*)x(.*) should be of color (.*)/ do |x, y, color|
129
- @image.pixel_color(x.to_i, y.to_i).to_color.sub(/^#/, '0x').should == color
130
- end
131
-
132
- And /that image should be (.*) bit image/ do |bits|
133
- if @image.depth < 8
134
- (@image.depth * 8).should == bits.to_i # newer versions return 1 for 8 bit?!
135
- else
136
- @image.depth.should == bits.to_i
137
- end
138
- end
139
-
140
- And /there should be no leaked images/ do
141
- Integer(http_client.get_content("http://localhost:3100/stats/images_loaded").strip).should == 0
142
- end
143
-
144
- And /there should be maximum (.*) images loaded during single request/ do |max|
145
- Integer(http_client.get_content("http://localhost:3100/stats/max_images_loaded").strip).should <= max.to_i
146
- end
147
-
148
- And /response body should be JSON encoded/ do
149
- @json = JSON.load(@response.body)
150
- end
151
-
152
- And /response JSON should contain key (.*) of value (.*)/ do |key, value|
153
- @json[key].should == value
154
- end
155
-
156
- And /response JSON should contain key (.*) of integer value (.*)/ do |key, value|
157
- @json[key].should == value.to_i
158
- end
159
-