httpthumbnailer 0.3.1 → 1.0.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.
@@ -0,0 +1,148 @@
1
+ require_relative 'spec_helper'
2
+ require 'unicorn-cuba-base'
3
+ require 'httpthumbnailer/plugin/thumbnailer'
4
+
5
+ class TestImage
6
+ include Plugin::Thumbnailer::ImageProcessing
7
+
8
+ @@created = 0
9
+ @@destroyed = 0
10
+
11
+ def self.alive
12
+ @@created - @@destroyed
13
+ end
14
+
15
+ def initialize
16
+ @@created += 1
17
+ @destroyed = false
18
+ @final = false
19
+ end
20
+
21
+ def destroy!
22
+ fail "already destroyed: #{self}" if @destroyed
23
+ @destroyed = true
24
+ @@destroyed += 1
25
+ self
26
+ end
27
+
28
+ def copy
29
+ TestImage.new
30
+ end
31
+
32
+ def destroyed?
33
+ @destroyed
34
+ end
35
+
36
+ def final!
37
+ @final = true
38
+ self
39
+ end
40
+
41
+ def final?
42
+ @final
43
+ end
44
+ end
45
+
46
+ describe 'image processing module' do
47
+ it '#replace will return new or original image makng sure that all other images are destroyed' do
48
+ image = TestImage.new.replace do |image|
49
+ image.copy.replace do |image|
50
+ image.final!
51
+ end
52
+ end
53
+ image.should be_final
54
+ image.should_not be_destroyed
55
+
56
+ TestImage.alive.should == 1
57
+ image.destroy!
58
+
59
+ image = TestImage.new.replace do |image|
60
+ image.copy.replace do |image|
61
+ image.copy.replace do |image|
62
+ image.copy
63
+ end.replace do |image|
64
+ image.final!
65
+ end
66
+ end
67
+ end
68
+ image.should be_final
69
+ image.should_not be_destroyed
70
+
71
+ TestImage.alive.should == 1
72
+ image.destroy!
73
+
74
+ image = TestImage.new.replace do |image|
75
+ image.copy.replace do |image|
76
+ image = image.copy.replace do |image|
77
+ image.copy
78
+ end
79
+ image.replace do |image|
80
+ image.copy.replace do |image|
81
+ image.final!
82
+ end
83
+ end
84
+ end
85
+ end
86
+ image.should be_final
87
+ image.should_not be_destroyed
88
+
89
+ TestImage.alive.should == 1
90
+ image.destroy!
91
+ end
92
+
93
+ it '#replace will destroy created images on exception' do
94
+ lambda {
95
+ image = TestImage.new.replace do |image|
96
+ image.copy.replace do |image|
97
+ image.copy.replace do |image|
98
+ image.copy.replace do |image|
99
+ fail 'test'
100
+ end
101
+ end
102
+ end
103
+ end
104
+ }.should raise_error(RuntimeError, 'test')
105
+
106
+ TestImage.alive.should == 0
107
+
108
+ lambda {
109
+ image = TestImage.new.replace do |image|
110
+ image.copy.replace do |image|
111
+ image.copy.replace do |image|
112
+ image.copy
113
+ end.replace do |image|
114
+ fail 'test'
115
+ image.final!
116
+ end
117
+ end
118
+ end
119
+ }.should raise_error(RuntimeError, 'test')
120
+
121
+ TestImage.alive.should == 0
122
+ end
123
+
124
+ it '#use should return image to be used for multiple processing and destroy it at the end' do
125
+ image = TestImage.new.use do |image|
126
+ i1 = image.replace do |image|
127
+ image.copy.final!
128
+ end
129
+ i1.should be_final
130
+ i1.destroy!
131
+
132
+ i2 = image.replace do |image|
133
+ image.copy.final!
134
+ end
135
+ i2.should be_final
136
+ i2.destroy!
137
+
138
+ i3 = image.replace do |image|
139
+ nil
140
+ end
141
+ i3.should_not be_destroyed
142
+ end
143
+ image.should be_destroyed
144
+
145
+ TestImage.alive.should == 0
146
+ end
147
+ end
148
+
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..'))
2
3
  $LOAD_PATH.unshift(File.dirname(__FILE__))
3
4
  require 'rspec'
4
5
 
@@ -6,6 +7,8 @@ require 'rspec'
6
7
  # in ./support/ and its subdirectories.
7
8
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
8
9
 
10
+ require 'capybara/rspec'
11
+
9
12
  RSpec.configure do |config|
10
-
11
13
  end
14
+
@@ -2,29 +2,42 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
  require 'httpthumbnailer/thumbnail_specs'
3
3
 
4
4
  describe ThumbnailSpecs do
5
- it "can be crated from URI" do
6
- ts = ThumbnailSpecs.from_uri('test,128,256,JPEG,magick:64,number:8/pad,128,128,PNG,background:0xFF00FF/crop,32,32,GIF')
5
+ it "can be created from URI" do
6
+ ts = ThumbnailSpecs.from_uri('test,128,256,jpeg,magick:64,number:8/pad,128,128,png,background:0xFF00FF/crop,32,32,gif')
7
7
 
8
8
  ts[0].method.should == 'test'
9
9
  ts[0].width.should == 128
10
10
  ts[0].height.should == 256
11
11
  ts[0].format.should == 'JPEG'
12
- ts[0].mime.should == 'image/jpeg'
13
12
  ts[0].options.should == { 'magick' => '64', 'number' => '8' }
14
13
 
15
14
  ts[1].method.should == 'pad'
16
15
  ts[1].width.should == 128
17
16
  ts[1].height.should == 128
18
17
  ts[1].format.should == 'PNG'
19
- ts[1].mime.should == 'image/png'
20
18
  ts[1].options.should == { 'background' => '0xFF00FF' }
21
19
 
22
20
  ts[2].method.should == 'crop'
23
21
  ts[2].width.should == 32
24
22
  ts[2].height.should == 32
25
23
  ts[2].format.should == 'GIF'
26
- ts[2].mime.should == 'image/gif'
27
24
  ts[2].options.should == {}
28
25
  end
26
+
27
+ it 'should provide :input symbol when input is used as width, height or format' do
28
+ ts = ThumbnailSpecs.from_uri('test,input,256,jpeg,magick:64,number:8/pad,128,input,png,background:0xFF00FF/crop,32,32,input')
29
+
30
+ ts[0].width.should == :input
31
+ ts[0].height.should == 256
32
+ ts[0].format.should == 'JPEG'
33
+
34
+ ts[1].width.should == 128
35
+ ts[1].height.should == :input
36
+ ts[1].format.should == 'PNG'
37
+
38
+ ts[2].width.should == 32
39
+ ts[2].height.should == 32
40
+ ts[2].format.should == :input
41
+ end
29
42
  end
30
43
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: httpthumbnailer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,33 +9,27 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-07 00:00:00.000000000 Z
12
+ date: 2013-07-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: sinatra
16
- requirement: &16915980 !ruby/object:Gem::Requirement
15
+ name: unicorn-cuba-base
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 1.2.6
21
+ version: '1.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *16915980
25
- - !ruby/object:Gem::Dependency
26
- name: mongrel
27
- requirement: &16908960 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
28
25
  none: false
29
26
  requirements:
30
- - - ! '>='
27
+ - - ~>
31
28
  - !ruby/object:Gem::Version
32
- version: 1.2.0.pre2
33
- type: :runtime
34
- prerelease: false
35
- version_requirements: *16908960
29
+ version: '1.0'
36
30
  - !ruby/object:Gem::Dependency
37
31
  name: rmagick
38
- requirement: &16930760 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
39
33
  none: false
40
34
  requirements:
41
35
  - - ~>
@@ -43,54 +37,47 @@ dependencies:
43
37
  version: '2'
44
38
  type: :runtime
45
39
  prerelease: false
46
- version_requirements: *16930760
47
- - !ruby/object:Gem::Dependency
48
- name: haml
49
- requirement: &16941920 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
50
41
  none: false
51
42
  requirements:
52
43
  - - ~>
53
44
  - !ruby/object:Gem::Version
54
- version: '3'
55
- type: :runtime
56
- prerelease: false
57
- version_requirements: *16941920
45
+ version: '2'
58
46
  - !ruby/object:Gem::Dependency
59
- name: ruby-ip
60
- requirement: &16939780 !ruby/object:Gem::Requirement
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
61
49
  none: false
62
50
  requirements:
63
51
  - - ~>
64
52
  - !ruby/object:Gem::Version
65
- version: '0.9'
66
- type: :runtime
53
+ version: '2.13'
54
+ type: :development
67
55
  prerelease: false
68
- version_requirements: *16939780
69
- - !ruby/object:Gem::Dependency
70
- name: cli
71
- requirement: &16938600 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
72
57
  none: false
73
58
  requirements:
74
59
  - - ~>
75
60
  - !ruby/object:Gem::Version
76
- version: 1.1.0
77
- type: :runtime
78
- prerelease: false
79
- version_requirements: *16938600
61
+ version: '2.13'
80
62
  - !ruby/object:Gem::Dependency
81
- name: rspec
82
- requirement: &16950140 !ruby/object:Gem::Requirement
63
+ name: rspec-mocks
64
+ requirement: !ruby/object:Gem::Requirement
83
65
  none: false
84
66
  requirements:
85
67
  - - ~>
86
68
  - !ruby/object:Gem::Version
87
- version: 2.3.0
69
+ version: '2.13'
88
70
  type: :development
89
71
  prerelease: false
90
- version_requirements: *16950140
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '2.13'
91
78
  - !ruby/object:Gem::Dependency
92
79
  name: cucumber
93
- requirement: &16949100 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
94
81
  none: false
95
82
  requirements:
96
83
  - - ! '>='
@@ -98,73 +85,108 @@ dependencies:
98
85
  version: '0'
99
86
  type: :development
100
87
  prerelease: false
101
- version_requirements: *16949100
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
102
94
  - !ruby/object:Gem::Dependency
103
- name: bundler
104
- requirement: &16947600 !ruby/object:Gem::Requirement
95
+ name: capybara
96
+ requirement: !ruby/object:Gem::Requirement
105
97
  none: false
106
98
  requirements:
107
99
  - - ~>
108
100
  - !ruby/object:Gem::Version
109
- version: 1.0.0
101
+ version: '1.1'
110
102
  type: :development
111
103
  prerelease: false
112
- version_requirements: *16947600
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: '1.1'
113
110
  - !ruby/object:Gem::Dependency
114
111
  name: jeweler
115
- requirement: &16946620 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
116
113
  none: false
117
114
  requirements:
118
115
  - - ~>
119
116
  - !ruby/object:Gem::Version
120
- version: 1.6.4
117
+ version: 1.8.4
121
118
  type: :development
122
119
  prerelease: false
123
- version_requirements: *16946620
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 1.8.4
124
126
  - !ruby/object:Gem::Dependency
125
- name: rcov
126
- requirement: &16944680 !ruby/object:Gem::Requirement
127
+ name: httpclient
128
+ requirement: !ruby/object:Gem::Requirement
127
129
  none: false
128
130
  requirements:
129
- - - ! '>='
131
+ - - ~>
130
132
  - !ruby/object:Gem::Version
131
- version: '0'
133
+ version: '2.3'
132
134
  type: :development
133
135
  prerelease: false
134
- version_requirements: *16944680
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: '2.3'
135
142
  - !ruby/object:Gem::Dependency
136
- name: daemon
137
- requirement: &16969400 !ruby/object:Gem::Requirement
143
+ name: rdoc
144
+ requirement: !ruby/object:Gem::Requirement
138
145
  none: false
139
146
  requirements:
140
147
  - - ~>
141
148
  - !ruby/object:Gem::Version
142
- version: '1'
149
+ version: '3.9'
143
150
  type: :development
144
151
  prerelease: false
145
- version_requirements: *16969400
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ~>
156
+ - !ruby/object:Gem::Version
157
+ version: '3.9'
146
158
  - !ruby/object:Gem::Dependency
147
- name: httpclient
148
- requirement: &16966000 !ruby/object:Gem::Requirement
159
+ name: multipart-parser
160
+ requirement: !ruby/object:Gem::Requirement
149
161
  none: false
150
162
  requirements:
151
163
  - - ~>
152
164
  - !ruby/object:Gem::Version
153
- version: '2.2'
165
+ version: 0.1.1
154
166
  type: :development
155
167
  prerelease: false
156
- version_requirements: *16966000
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ~>
172
+ - !ruby/object:Gem::Version
173
+ version: 0.1.1
157
174
  - !ruby/object:Gem::Dependency
158
- name: rdoc
159
- requirement: &16996480 !ruby/object:Gem::Requirement
175
+ name: daemon
176
+ requirement: !ruby/object:Gem::Requirement
160
177
  none: false
161
178
  requirements:
162
179
  - - ~>
163
180
  - !ruby/object:Gem::Version
164
- version: '3.9'
181
+ version: '1.1'
165
182
  type: :development
166
183
  prerelease: false
167
- version_requirements: *16996480
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ~>
188
+ - !ruby/object:Gem::Version
189
+ version: '1.1'
168
190
  description: Provides HTTP API for thumbnailing images
169
191
  email: jpastuszek@gmail.com
170
192
  executables:
@@ -191,25 +213,33 @@ files:
191
213
  - features/support/test.jpg
192
214
  - features/support/test.png
193
215
  - features/support/test.txt
216
+ - features/thumbnail.feature
217
+ - features/thumbnails.feature
194
218
  - httpthumbnailer.gemspec
195
- - lib/httpthumbnailer/multipart_response.rb
219
+ - lib/httpthumbnailer/error_reporter.rb
220
+ - lib/httpthumbnailer/plugin/thumbnailer.rb
196
221
  - lib/httpthumbnailer/thumbnail_specs.rb
197
222
  - lib/httpthumbnailer/thumbnailer.rb
198
223
  - load_test/extralarge.jpg
199
224
  - load_test/large.jpg
200
225
  - load_test/large.png
226
+ - load_test/load_test-cd9679c.csv
227
+ - load_test/load_test-v0.3.1.csv
201
228
  - load_test/load_test.jmx
202
229
  - load_test/medium.jpg
203
230
  - load_test/small.jpg
231
+ - load_test/soak_test-ac0c6bcbe5e-broken-libjpeg-tatoos.csv
232
+ - load_test/soak_test-cd9679c.csv
233
+ - load_test/soak_test-f98334a-tatoos.csv
234
+ - load_test/soak_test.jmx
204
235
  - load_test/tiny.jpg
205
236
  - load_test/v0.0.13-loading.csv
206
237
  - load_test/v0.0.13.csv
207
238
  - load_test/v0.0.14-no-optimization.csv
208
239
  - load_test/v0.0.14.csv
209
- - spec/multipart_response_spec.rb
240
+ - spec/image_processing_spec.rb
210
241
  - spec/spec_helper.rb
211
242
  - spec/thumbnail_specs_spec.rb
212
- - spec/thumbnailer_spec.rb
213
243
  homepage: http://github.com/jpastuszek/httpthumbnailer
214
244
  licenses:
215
245
  - MIT
@@ -225,7 +255,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
225
255
  version: '0'
226
256
  segments:
227
257
  - 0
228
- hash: 1020802750918011065
258
+ hash: -1707312696099202820
229
259
  required_rubygems_version: !ruby/object:Gem::Requirement
230
260
  none: false
231
261
  requirements:
@@ -234,7 +264,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
234
264
  version: '0'
235
265
  requirements: []
236
266
  rubyforge_project:
237
- rubygems_version: 1.8.15
267
+ rubygems_version: 1.8.25
238
268
  signing_key:
239
269
  specification_version: 3
240
270
  summary: HTTP thumbnailing server
@@ -1,45 +0,0 @@
1
- class MultipartResponse
2
- class NoBoundaryFoundInContentTypeError < ArgumentError
3
- def initialize(content_type_header, exception)
4
- super("Content-Type header of '#{content_type_header}' has no boundary defined: #{exception.class.name}: #{exception}")
5
- end
6
- end
7
-
8
- class Part
9
- def initialize(data)
10
- if data.include?("\r\n\r\n")
11
- headers, *body = *data.split("\r\n\r\n")
12
- @headers = Hash[headers.split("\r\n").map{|h| h.split(/: ?/)}]
13
- @body = body.join("\r\n\r\n")
14
- else
15
- @headers = {'Content-Type' => 'text/plain'}
16
- @body = data
17
- end
18
- end
19
-
20
- attr_reader :headers, :body
21
- alias :header :headers
22
- end
23
-
24
- def initialize(content_type_header, body)
25
- @boundary = begin
26
- content_type_header.split(';').map{|e| e.strip}.select{|e| e =~ /^boundary=/}.first.match(/^boundary="(.*)"/)[1]
27
- rescue => e
28
- raise NoBoundaryFoundInContentTypeError.new(content_type_header, e)
29
- end
30
-
31
- body, epilogue = *body.split("--#{@boundary}--")
32
- preamble, *parts = *body.split("--#{@boundary}")
33
-
34
- @preamble = preamble.sub(/\r\n$/m, '')
35
- @preamble = nil if @preamble.empty?
36
-
37
- @epilogue = epilogue.sub(/^\r\n/m, '') if epilogue
38
-
39
- @parts = parts.map{|p| p.sub(/^\r\n/m, '').sub(/\r\n$/m, '')}.map{|p| Part.new(p)}
40
- end
41
-
42
- attr_reader :boundary, :preamble, :parts, :epilogue
43
- alias :part :parts
44
- end
45
-
@@ -1,95 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
- require 'httpthumbnailer/multipart_response'
3
-
4
- describe MultipartResponse do
5
- describe "parsing" do
6
- it "should privide preamble, parts with headers and epilogue" do
7
- content_type_header = 'multipart/mixed; boundary="cut here"'
8
- body =
9
- """hello
10
- --cut here
11
- Content-Type: text/plain
12
-
13
- part 1
14
- --cut here
15
- Content-Type: text/html
16
- Content-Transfer-Encoding: base64
17
-
18
- part 2
19
- --cut here
20
- part 3
21
- --cut here--
22
- world""".gsub!("\n", "\r\n")
23
-
24
- mr = MultipartResponse.new(content_type_header, body)
25
- mr.preamble.should == "hello"
26
-
27
- mr.parts[0].body.should == "part 1"
28
- mr.parts[0].header['Content-Type'].should == "text/plain"
29
-
30
- mr.parts[1].body.should == "part 2"
31
- mr.parts[1].header['Content-Type'].should == "text/html"
32
- mr.parts[1].header['Content-Transfer-Encoding'].should == "base64"
33
-
34
- mr.parts[2].body.should == "part 3"
35
-
36
- mr.epilogue.should == "world"
37
- end
38
-
39
- it "should privide nil preamble if no prologue sent" do
40
- content_type_header = 'multipart/mixed; boundary="cut here"'
41
- body =
42
- """--cut here
43
- part 1
44
- --cut here--""".gsub!("\n", "\r\n")
45
-
46
- mr = MultipartResponse.new(content_type_header, body)
47
- mr.preamble.should be_nil
48
- end
49
-
50
- it "should privide nil epilogue if no epilogue sent" do
51
- content_type_header = 'multipart/mixed; boundary="cut here"'
52
- body =
53
- """--cut here
54
- part 1
55
- --cut here--""".gsub!("\n", "\r\n")
56
-
57
- mr = MultipartResponse.new(content_type_header, body)
58
- mr.epilogue.should be_nil
59
- end
60
-
61
- it "should provide default mime type of text/plain if no Content-Type header specified" do
62
- content_type_header = 'multipart/mixed; boundary="cut here"'
63
- body =
64
- """--cut here
65
- part 1
66
- --cut here--""".gsub!("\n", "\r\n")
67
-
68
- mr = MultipartResponse.new(content_type_header, body)
69
- mr.part[0].header['Content-Type'].should == 'text/plain'
70
- end
71
-
72
- it "should fail with MultipartResponse::NoBoundaryFoundInContentTypeError if no boundary specified in content type header" do
73
- lambda {
74
- MultipartResponse.new("fas", "")
75
- }.should raise_error MultipartResponse::NoBoundaryFoundInContentTypeError
76
- end
77
- end
78
-
79
- it "provides part alias" do
80
- content_type_header = 'multipart/mixed; boundary="cut here"'
81
- body =
82
- """--cut here
83
- part 1
84
- --cut here
85
- part 2
86
- --cut here
87
- part 3
88
- --cut here--""".gsub!("\n", "\r\n")
89
-
90
- mr = MultipartResponse.new(content_type_header, body)
91
- mr.part[0].body.should == "part 1"
92
- mr.part[1].body.should == "part 2"
93
- mr.part[2].body.should == "part 3"
94
- end
95
- end
@@ -1,33 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
- require 'httpthumbnailer/thumbnailer'
3
-
4
- describe ThumbnailSpec do
5
- it "should store thumbanil attributes method, widht, height and options" do
6
- t = ThumbnailSpec.new('pad', 128, 256, 'PNG', 'background' => '0x00ffff')
7
- t.method.should == 'pad'
8
- t.width.should == 128
9
- t.height.should == 256
10
- t.format.should == 'PNG'
11
- t.mime.should == 'image/png'
12
- t.options.should == { 'background' => '0x00ffff' }
13
- end
14
-
15
- it "should return full jpeg mime time on JPG format" do
16
- t = ThumbnailSpec.new('pad', 128, 256, 'JPG')
17
- t.format.should == 'JPG'
18
- t.mime.should == 'image/jpeg'
19
- end
20
- end
21
-
22
- describe Thumbnailer do
23
- it 'should allow adding new method of thumbnails' do
24
- t = Thumbnailer.new
25
-
26
- t.method('test') do |image, spec|
27
- image + spec.width + spec.height + spec.format.to_i + spec.options[:magic]
28
- end
29
-
30
- t.process_image(256, ThumbnailSpec.new('test', 128, 32, '8', :magic => 64)).should == 256 + 128 + 32 + 8 + 64
31
- end
32
- end
33
-