httpthumbnailer-client 1.1.1 → 1.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/Gemfile.lock +7 -7
- data/README.md +28 -22
- data/VERSION +1 -1
- data/httpthumbnailer-client.gemspec +3 -3
- data/lib/httpthumbnailer-client.rb +16 -5
- data/spec/identify_spec.rb +12 -1
- data/spec/thumbnail_spec.rb +28 -1
- data/spec/thumbnails_spec.rb +21 -6
- metadata +4 -4
data/Gemfile.lock
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ../httpthumbnailer
|
3
3
|
specs:
|
4
|
-
httpthumbnailer (1.
|
4
|
+
httpthumbnailer (1.2.0)
|
5
5
|
rmagick (~> 2)
|
6
|
-
unicorn-cuba-base (~> 1.
|
6
|
+
unicorn-cuba-base (~> 1.2.0)
|
7
7
|
|
8
8
|
PATH
|
9
9
|
remote: ../unicorn-cuba-base
|
10
10
|
specs:
|
11
|
-
unicorn-cuba-base (1.
|
11
|
+
unicorn-cuba-base (1.2.0)
|
12
12
|
cli (~> 1.3)
|
13
13
|
cuba (~> 3.0)
|
14
14
|
facter (~> 1.6.11)
|
@@ -21,7 +21,7 @@ GEM
|
|
21
21
|
specs:
|
22
22
|
builder (3.0.0)
|
23
23
|
cli (1.3.1)
|
24
|
-
cuba (3.1.
|
24
|
+
cuba (3.1.1)
|
25
25
|
rack
|
26
26
|
cucumber (1.1.3)
|
27
27
|
builder (>= 2.1.2)
|
@@ -42,10 +42,10 @@ GEM
|
|
42
42
|
rake
|
43
43
|
rdoc
|
44
44
|
json (1.6.1)
|
45
|
-
kgio (2.
|
45
|
+
kgio (2.9.2)
|
46
46
|
multipart-parser (0.1.1)
|
47
47
|
rack (1.5.2)
|
48
|
-
raindrops (0.
|
48
|
+
raindrops (0.13.0)
|
49
49
|
rake (10.0.4)
|
50
50
|
rdoc (3.9.4)
|
51
51
|
rmagick (2.13.2)
|
@@ -59,7 +59,7 @@ GEM
|
|
59
59
|
rspec-mocks (2.13.1)
|
60
60
|
ruby-ip (0.9.1)
|
61
61
|
term-ansicolor (1.0.7)
|
62
|
-
unicorn (4.
|
62
|
+
unicorn (4.8.2)
|
63
63
|
kgio (~> 2.6)
|
64
64
|
rack
|
65
65
|
raindrops (~> 0.7)
|
data/README.md
CHANGED
@@ -23,10 +23,10 @@ data = File.read('image_file.jpg')
|
|
23
23
|
|
24
24
|
# generate single thumbnail from image data (single thumbnail API)
|
25
25
|
thumbnail = HTTPThumbnailerClient.new('http://localhost:3100').thumbnail(data, 'crop', 60, 30, 'jpeg')
|
26
|
-
thumbnail.mime_type
|
27
|
-
thumbnail.width
|
28
|
-
thumbnail.height
|
29
|
-
thumbnail.data
|
26
|
+
thumbnail.mime_type # => 'image/jpeg'
|
27
|
+
thumbnail.width # => 60
|
28
|
+
thumbnail.height # => 30
|
29
|
+
thumbnail.data # => 60x30 thumbnail JPEG data String
|
30
30
|
|
31
31
|
# generate set of thumbnails from image data (multipart API)
|
32
32
|
thumbnails = HTTPThumbnailerClient.new('http://localhost:3100').thumbnail(data) do
|
@@ -35,30 +35,36 @@ thumbnails = HTTPThumbnailerClient.new('http://localhost:3100').thumbnail(data)
|
|
35
35
|
thumbnail 'pad', 40, 40, 'png'
|
36
36
|
end
|
37
37
|
|
38
|
-
thumbnails[0].mime_type
|
39
|
-
thumbnails[0].width
|
40
|
-
thumbnails[0].height
|
41
|
-
thumbnails[0].data
|
38
|
+
thumbnails[0].mime_type # => 'image/jpeg'
|
39
|
+
thumbnails[0].width # => 60
|
40
|
+
thumbnails[0].height # => 30
|
41
|
+
thumbnails[0].data # => 60x30 thumbnail JPEG data String
|
42
42
|
|
43
|
-
thumbnails[1].mime_type
|
44
|
-
thumbnails[1].width
|
45
|
-
thumbnails[1].height
|
46
|
-
thumbnails[1].data
|
43
|
+
thumbnails[1].mime_type # => 'image/png'
|
44
|
+
thumbnails[1].width # => 80
|
45
|
+
thumbnails[1].height # => 80
|
46
|
+
thumbnails[1].data # => 80x80 thumbnail PNG data String
|
47
47
|
|
48
|
-
thumbnails[2].mime_type
|
49
|
-
thumbnails[2].width
|
50
|
-
thumbnails[2].height
|
51
|
-
thumbnails[2].data
|
48
|
+
thumbnails[2].mime_type # => 'image/png'
|
49
|
+
thumbnails[2].width # => 40
|
50
|
+
thumbnails[2].height # => 40
|
51
|
+
thumbnails[2].data # => 40x40 thumbnail PNG data String
|
52
52
|
|
53
|
-
thumbnails.input_mime_type
|
54
|
-
thumbnails.input_width
|
55
|
-
thumbnails.input_height
|
53
|
+
thumbnails.input_mime_type # => 'image/jpeg' - detected input image format by API server (content based)
|
54
|
+
thumbnails.input_width # => 800 - detected input image width by API server (content based)
|
55
|
+
thumbnails.input_height # => 600 - detected input image height by API server (content based)
|
56
56
|
|
57
57
|
# just identify the image
|
58
58
|
id = HTTPThumbnailerClient.new('http://localhost:3100').identify(data)
|
59
|
-
id.mime_type
|
60
|
-
id.width
|
61
|
-
id.height
|
59
|
+
id.mime_type # => 'image/jpeg'
|
60
|
+
id.width # => 800
|
61
|
+
id.height # => 600
|
62
|
+
|
63
|
+
# pass transaction ID header to thumbnailer
|
64
|
+
id = HTTPThumbnailerClient.new('http://localhost:3100').with_headers('XID' => '123').identify(data)
|
65
|
+
id.mime_type # => 'image/jpeg'
|
66
|
+
id.width # => 800
|
67
|
+
id.height # => 600
|
62
68
|
```
|
63
69
|
|
64
70
|
For more details see RSpec for [single thumbnail API](http://github.com/jpastuszek/httpthumbnailer-client/blob/master/spec/thumbnail_spec.rb) and [multipart API](http://github.com/jpastuszek/httpthumbnailer-client/blob/master/spec/thumbnails_spec.rb).
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0
|
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "httpthumbnailer-client"
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.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 = "
|
12
|
+
s.date = "2014-07-28"
|
13
13
|
s.description = "Thumbnails images using httpthumbniler server"
|
14
14
|
s.email = "jpastuszek@gmail.com"
|
15
15
|
s.executables = ["httpthumbnailer-client"]
|
@@ -44,7 +44,7 @@ Gem::Specification.new do |s|
|
|
44
44
|
s.homepage = "http://github.com/jpastuszek/httpthumbnailer-client"
|
45
45
|
s.licenses = ["MIT"]
|
46
46
|
s.require_paths = ["lib"]
|
47
|
-
s.rubygems_version = "1.8.
|
47
|
+
s.rubygems_version = "1.8.23"
|
48
48
|
s.summary = "API client for httpthumbniler server"
|
49
49
|
|
50
50
|
if s.respond_to? :specification_version then
|
@@ -88,8 +88,8 @@ class HTTPThumbnailerClient
|
|
88
88
|
args << format.to_s
|
89
89
|
|
90
90
|
options.keys.sort{|a, b| a.to_s <=> b.to_s}.each do |key|
|
91
|
-
raise InvalidThumbnailSpecificationError.new("empty option key for value '#{options[key]}'") if key.nil? || key.to_s.empty?
|
92
|
-
raise InvalidThumbnailSpecificationError.new("missing option value for key '#{key}'") if options[key].nil? || options[key].to_s.empty?
|
91
|
+
raise InvalidThumbnailSpecificationError.new("empty option key for value '#{options[key]}'") if key.nil? || key.to_s.empty?
|
92
|
+
raise InvalidThumbnailSpecificationError.new("missing option value for key '#{key}'") if options[key].nil? || options[key].to_s.empty?
|
93
93
|
args << "#{key}:#{options[key]}"
|
94
94
|
end
|
95
95
|
|
@@ -106,7 +106,7 @@ class HTTPThumbnailerClient
|
|
106
106
|
# added to thumbnailer v1.1.0 so may be nil for older server
|
107
107
|
@width = width.to_i if width
|
108
108
|
@height = height.to_i if height
|
109
|
-
end
|
109
|
+
end
|
110
110
|
|
111
111
|
attr_reader :mime_type
|
112
112
|
attr_reader :width
|
@@ -143,6 +143,9 @@ class HTTPThumbnailerClient
|
|
143
143
|
@client.send_timeout = options[:send_timeout] || 300
|
144
144
|
@client.receive_timeout = options[:receive_timeout] || 300
|
145
145
|
|
146
|
+
# additional HTTP headers to be passed with requests
|
147
|
+
@headers = options[:headers] || {}
|
148
|
+
|
146
149
|
# don't use keep alive by default since backend won't support it any way unless fronted with nginx or similar
|
147
150
|
@keep_alive = options[:keep_alive] || false
|
148
151
|
end
|
@@ -157,7 +160,7 @@ class HTTPThumbnailerClient
|
|
157
160
|
URIBuilder.thumbnail(*spec)
|
158
161
|
end
|
159
162
|
|
160
|
-
response = @client.request('PUT', "#{@server_url}#{uri}", nil, data, {'Content-Type' => 'image/autodetect'})
|
163
|
+
response = @client.request('PUT', "#{@server_url}#{uri}", nil, data, {'Content-Type' => 'image/autodetect'}.merge(@headers))
|
161
164
|
@client.reset_all unless @keep_alive
|
162
165
|
|
163
166
|
content_type = response.header['Content-Type'].last
|
@@ -216,7 +219,7 @@ class HTTPThumbnailerClient
|
|
216
219
|
end
|
217
220
|
|
218
221
|
def identify(data)
|
219
|
-
response = @client.request('PUT', "#{@server_url}/identify", nil, data, {'Content-Type' => 'image/autodetect'})
|
222
|
+
response = @client.request('PUT', "#{@server_url}/identify", nil, data, {'Content-Type' => 'image/autodetect'}.merge(@headers))
|
220
223
|
@client.reset_all unless @keep_alive
|
221
224
|
|
222
225
|
content_type = response.header['Content-Type'].last
|
@@ -235,6 +238,14 @@ class HTTPThumbnailerClient
|
|
235
238
|
raise RemoteServerError, 'empty response'
|
236
239
|
end
|
237
240
|
|
241
|
+
attr_accessor :headers
|
242
|
+
|
243
|
+
def with_headers(headers)
|
244
|
+
n = self.dup
|
245
|
+
n.headers = @headers.merge headers
|
246
|
+
n
|
247
|
+
end
|
248
|
+
|
238
249
|
def inspect
|
239
250
|
"#<#{self.class.name} server_url=#{server_url.inspect} keep_alive=#{keep_alive.inspect}>"
|
240
251
|
end
|
data/spec/identify_spec.rb
CHANGED
@@ -4,7 +4,7 @@ describe HTTPThumbnailerClient, 'identify API' do
|
|
4
4
|
before :all do
|
5
5
|
log = support_dir + 'server.log'
|
6
6
|
start_server(
|
7
|
-
"httpthumbnailer -f -d -l #{log}",
|
7
|
+
"httpthumbnailer -f -d -x XID -l #{log}",
|
8
8
|
'/tmp/httpthumbnailer.pid',
|
9
9
|
log,
|
10
10
|
'http://localhost:3100/'
|
@@ -29,5 +29,16 @@ describe HTTPThumbnailerClient, 'identify API' do
|
|
29
29
|
}.should raise_error HTTPThumbnailerClient::UnsupportedMediaTypeError
|
30
30
|
end
|
31
31
|
end
|
32
|
+
|
33
|
+
describe 'passing custom HTTP request headers' do
|
34
|
+
it '#with_headers should add headers to given request' do
|
35
|
+
xid = rand(0..1000)
|
36
|
+
|
37
|
+
input_id = HTTPThumbnailerClient.new('http://localhost:3100').with_headers('XID' => xid).identify((support_dir + 'test.jpg').read)
|
38
|
+
input_id.mime_type.should == 'image/jpeg'
|
39
|
+
|
40
|
+
(support_dir + 'server.log').read.should include "xid=\"#{xid}\""
|
41
|
+
end
|
42
|
+
end
|
32
43
|
end
|
33
44
|
|
data/spec/thumbnail_spec.rb
CHANGED
@@ -4,7 +4,7 @@ describe HTTPThumbnailerClient, 'single thumbnail API' do
|
|
4
4
|
before :all do
|
5
5
|
log = support_dir + 'server.log'
|
6
6
|
start_server(
|
7
|
-
"httpthumbnailer -f -d -l #{log}",
|
7
|
+
"httpthumbnailer -f -d -x XID -l #{log}",
|
8
8
|
'/tmp/httpthumbnailer.pid',
|
9
9
|
log,
|
10
10
|
'http://localhost:3100/'
|
@@ -71,5 +71,32 @@ describe HTTPThumbnailerClient, 'single thumbnail API' do
|
|
71
71
|
}.should raise_error HTTPThumbnailerClient::ImageTooLargeError
|
72
72
|
end
|
73
73
|
end
|
74
|
+
|
75
|
+
describe 'passing custom HTTP request headers' do
|
76
|
+
it 'should add headers provided with :headers option' do
|
77
|
+
xid = rand(0..1000)
|
78
|
+
|
79
|
+
thumbnail = HTTPThumbnailerClient.new('http://localhost:3100', headers: {'XID' => xid}).thumbnail((support_dir + 'test.jpg').read, 'crop', 6, 3, 'jpeg')
|
80
|
+
thumbnail.should be_kind_of HTTPThumbnailerClient::Thumbnail
|
81
|
+
|
82
|
+
(support_dir + 'server.log').read.should include "xid=\"#{xid}\""
|
83
|
+
end
|
84
|
+
|
85
|
+
it '#with_headers should add headers to given request' do
|
86
|
+
xid = rand(0..1000)
|
87
|
+
|
88
|
+
thumbnail = HTTPThumbnailerClient.new('http://localhost:3100').with_headers('XID' => xid).thumbnail((support_dir + 'test.jpg').read, 'crop', 6, 3, 'jpeg')
|
89
|
+
thumbnail.should be_kind_of HTTPThumbnailerClient::Thumbnail
|
90
|
+
|
91
|
+
(support_dir + 'server.log').read.should include "xid=\"#{xid}\""
|
92
|
+
|
93
|
+
xid = rand(1000..2000)
|
94
|
+
|
95
|
+
thumbnail = HTTPThumbnailerClient.new('http://localhost:3100').with_headers('XID' => xid).thumbnail((support_dir + 'test.jpg').read, 'crop', 6, 3, 'jpeg')
|
96
|
+
thumbnail.should be_kind_of HTTPThumbnailerClient::Thumbnail
|
97
|
+
|
98
|
+
(support_dir + 'server.log').read.should include "xid=\"#{xid}\""
|
99
|
+
end
|
100
|
+
end
|
74
101
|
end
|
75
102
|
|
data/spec/thumbnails_spec.rb
CHANGED
@@ -4,7 +4,7 @@ describe HTTPThumbnailerClient, 'multipart API' do
|
|
4
4
|
before :all do
|
5
5
|
log = support_dir + 'server.log'
|
6
6
|
start_server(
|
7
|
-
"httpthumbnailer -f -d -l #{log}",
|
7
|
+
"httpthumbnailer -f -d -x XID -l #{log}",
|
8
8
|
'/tmp/httpthumbnailer.pid',
|
9
9
|
log,
|
10
10
|
'http://localhost:3100/'
|
@@ -17,7 +17,7 @@ describe HTTPThumbnailerClient, 'multipart API' do
|
|
17
17
|
|
18
18
|
it 'should return set of thumbnails matching specifications' do
|
19
19
|
thumbs = HTTPThumbnailerClient.new('http://localhost:3100').thumbnail((support_dir + 'test.jpg').read) do
|
20
|
-
thumbnail 'crop', 60, 30, 'jpeg'
|
20
|
+
thumbnail 'crop', 60, 30, 'jpeg'
|
21
21
|
thumbnail 'crop', 80, 80, 'png'
|
22
22
|
thumbnail 'crop', 40, 40, 'png'
|
23
23
|
end
|
@@ -53,14 +53,14 @@ describe HTTPThumbnailerClient, 'multipart API' do
|
|
53
53
|
describe 'meta data' do
|
54
54
|
it 'should provide input image mime type' do
|
55
55
|
thumbs = HTTPThumbnailerClient.new('http://localhost:3100').thumbnail((support_dir + 'test.jpg').read) do
|
56
|
-
thumbnail 'crop', 6, 3, 'jpeg'
|
56
|
+
thumbnail 'crop', 6, 3, 'jpeg'
|
57
57
|
end
|
58
58
|
thumbs.input_mime_type.should == 'image/jpeg'
|
59
59
|
end
|
60
60
|
|
61
61
|
it 'should provide input image size' do
|
62
62
|
thumbs = HTTPThumbnailerClient.new('http://localhost:3100').thumbnail((support_dir + 'test.jpg').read) do
|
63
|
-
thumbnail 'crop', 6, 3, 'jpeg'
|
63
|
+
thumbnail 'crop', 6, 3, 'jpeg'
|
64
64
|
end
|
65
65
|
thumbs.input_width.should == 509
|
66
66
|
thumbs.input_height.should == 719
|
@@ -70,7 +70,7 @@ describe HTTPThumbnailerClient, 'multipart API' do
|
|
70
70
|
describe 'returns HTTPThumbnailerClient::HTTPThumbnailerClientError object within set of returned thumbnails' do
|
71
71
|
it 'in case of error with particluar thumbanil' do
|
72
72
|
thumbs = HTTPThumbnailerClient.new('http://localhost:3100').thumbnail((support_dir + 'test.jpg').read) do
|
73
|
-
thumbnail 'crop', 6, 3, 'jpeg'
|
73
|
+
thumbnail 'crop', 6, 3, 'jpeg'
|
74
74
|
thumbnail 'crop', 0, 0, 'png'
|
75
75
|
thumbnail 'crop', 4, 4, 'png'
|
76
76
|
end
|
@@ -96,7 +96,7 @@ describe HTTPThumbnailerClient, 'multipart API' do
|
|
96
96
|
|
97
97
|
it 'in case of memory exhaustion while thumbnailing' do
|
98
98
|
thumbs = HTTPThumbnailerClient.new('http://localhost:3100').thumbnail((support_dir + 'test.jpg').read) do
|
99
|
-
thumbnail 'crop', 6, 3, 'jpeg'
|
99
|
+
thumbnail 'crop', 6, 3, 'jpeg'
|
100
100
|
thumbnail 'crop', 16000, 16000, 'png'
|
101
101
|
thumbnail 'crop', 4, 4, 'png'
|
102
102
|
end
|
@@ -120,5 +120,20 @@ describe HTTPThumbnailerClient, 'multipart API' do
|
|
120
120
|
i.height.should == 4
|
121
121
|
end
|
122
122
|
end
|
123
|
+
|
124
|
+
describe 'passing custom HTTP request headers' do
|
125
|
+
it '#with_headers should add headers to given request' do
|
126
|
+
xid = rand(0..1000)
|
127
|
+
|
128
|
+
thumbs = HTTPThumbnailerClient.new('http://localhost:3100').with_headers('XID' => xid).thumbnail((support_dir + 'test.jpg').read) do
|
129
|
+
thumbnail 'crop', 60, 30, 'jpeg'
|
130
|
+
thumbnail 'crop', 80, 80, 'png'
|
131
|
+
thumbnail 'crop', 40, 40, 'png'
|
132
|
+
end
|
133
|
+
thumbs[0].should be_kind_of HTTPThumbnailerClient::Thumbnail
|
134
|
+
|
135
|
+
(support_dir + 'server.log').read.should include "xid=\"#{xid}\""
|
136
|
+
end
|
137
|
+
end
|
123
138
|
end
|
124
139
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: httpthumbnailer-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-07-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httpclient
|
@@ -249,7 +249,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
249
249
|
version: '0'
|
250
250
|
segments:
|
251
251
|
- 0
|
252
|
-
hash:
|
252
|
+
hash: 2965592177310199957
|
253
253
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
254
254
|
none: false
|
255
255
|
requirements:
|
@@ -258,7 +258,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
258
258
|
version: '0'
|
259
259
|
requirements: []
|
260
260
|
rubyforge_project:
|
261
|
-
rubygems_version: 1.8.
|
261
|
+
rubygems_version: 1.8.23
|
262
262
|
signing_key:
|
263
263
|
specification_version: 3
|
264
264
|
summary: API client for httpthumbniler server
|