pothoven-attachment_fu 3.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.
Files changed (49) hide show
  1. data/CHANGELOG +59 -0
  2. data/LICENSE +20 -0
  3. data/README +253 -0
  4. data/Rakefile +22 -0
  5. data/amazon_s3.yml.tpl +17 -0
  6. data/install.rb +7 -0
  7. data/lib/geometry.rb +96 -0
  8. data/lib/pothoven-attachment_fu.rb +21 -0
  9. data/lib/technoweenie/attachment_fu/backends/cloud_file_backend.rb +211 -0
  10. data/lib/technoweenie/attachment_fu/backends/db_file_backend.rb +39 -0
  11. data/lib/technoweenie/attachment_fu/backends/file_system_backend.rb +126 -0
  12. data/lib/technoweenie/attachment_fu/backends/s3_backend.rb +394 -0
  13. data/lib/technoweenie/attachment_fu/processors/core_image_processor.rb +66 -0
  14. data/lib/technoweenie/attachment_fu/processors/gd2_processor.rb +59 -0
  15. data/lib/technoweenie/attachment_fu/processors/image_science_processor.rb +80 -0
  16. data/lib/technoweenie/attachment_fu/processors/mini_magick_processor.rb +142 -0
  17. data/lib/technoweenie/attachment_fu/processors/rmagick_processor.rb +84 -0
  18. data/lib/technoweenie/attachment_fu.rb +577 -0
  19. data/rackspace_cloudfiles.yml.tpl +14 -0
  20. data/test/backends/db_file_test.rb +16 -0
  21. data/test/backends/file_system_test.rb +143 -0
  22. data/test/backends/remote/cloudfiles_test.rb +102 -0
  23. data/test/backends/remote/s3_test.rb +119 -0
  24. data/test/base_attachment_tests.rb +77 -0
  25. data/test/basic_test.rb +120 -0
  26. data/test/database.yml +18 -0
  27. data/test/extra_attachment_test.rb +67 -0
  28. data/test/fixtures/attachment.rb +304 -0
  29. data/test/fixtures/files/fake/rails.png +0 -0
  30. data/test/fixtures/files/foo.txt +1 -0
  31. data/test/fixtures/files/rails.jpg +0 -0
  32. data/test/fixtures/files/rails.png +0 -0
  33. data/test/geometry_test.rb +114 -0
  34. data/test/processors/core_image_test.rb +58 -0
  35. data/test/processors/gd2_test.rb +51 -0
  36. data/test/processors/image_science_test.rb +54 -0
  37. data/test/processors/mini_magick_test.rb +122 -0
  38. data/test/processors/rmagick_test.rb +272 -0
  39. data/test/schema.rb +136 -0
  40. data/test/test_helper.rb +180 -0
  41. data/test/validation_test.rb +55 -0
  42. data/vendor/red_artisan/core_image/filters/color.rb +27 -0
  43. data/vendor/red_artisan/core_image/filters/effects.rb +31 -0
  44. data/vendor/red_artisan/core_image/filters/perspective.rb +25 -0
  45. data/vendor/red_artisan/core_image/filters/quality.rb +25 -0
  46. data/vendor/red_artisan/core_image/filters/scale.rb +47 -0
  47. data/vendor/red_artisan/core_image/filters/watermark.rb +32 -0
  48. data/vendor/red_artisan/core_image/processor.rb +123 -0
  49. metadata +97 -0
@@ -0,0 +1,304 @@
1
+ class Attachment < ActiveRecord::Base
2
+ @@saves = 0
3
+ cattr_accessor :saves
4
+ has_attachment :processor => :rmagick
5
+ validates_as_attachment
6
+ after_save do |record|
7
+ self.saves += 1
8
+ end
9
+ end
10
+
11
+ class LowerQualityAttachment < Attachment
12
+ set_table_name 'attachments'
13
+ has_attachment :resize_to => [55,55], :jpeg_quality => 50
14
+ end
15
+
16
+ class SmallAttachment < Attachment
17
+ has_attachment :max_size => 1.kilobyte
18
+ end
19
+
20
+ class BigAttachment < Attachment
21
+ has_attachment :size => 1.megabyte..2.megabytes
22
+ end
23
+
24
+ class PdfAttachment < Attachment
25
+ has_attachment :content_type => 'pdf'
26
+ end
27
+
28
+ class DocAttachment < Attachment
29
+ has_attachment :content_type => %w(pdf doc txt)
30
+ end
31
+
32
+ class ImageAttachment < Attachment
33
+ has_attachment :content_type => :image, :resize_to => [50,50]
34
+ end
35
+
36
+ class ImageOrPdfAttachment < Attachment
37
+ has_attachment :content_type => ['pdf', :image], :resize_to => 'x50'
38
+ end
39
+
40
+ class ImageWithThumbsAttachment < Attachment
41
+ has_attachment :thumbnails => { :thumb => [50, 50], :geometry => 'x50' }, :resize_to => [55,55]
42
+ # after_resize do |record, img|
43
+ # record.aspect_ratio = img.columns.to_f / img.rows.to_f
44
+ # end
45
+ end
46
+
47
+ class ImageWithPerThumbJpegAttachment < Attachment
48
+ has_attachment :resize_to => '500x500!',
49
+ :thumbnails => { :thumb => '50x50!', :large => '300x300!', :avatar => '64x64!' },
50
+ :jpeg_quality => { :thumb => 90, '<5000' => 85, '>=5000' => 75, :large => 0x200 | 75 }
51
+ end
52
+
53
+ class ImageWithPolymorphicThumbsAttachment < Attachment
54
+ belongs_to :imageable, :polymorphic => true
55
+ has_attachment :thumbnails => {
56
+ :thumb => [50, 50],
57
+ :geometry => 'x50',
58
+ :products => { :large_thumb => '169x169!', :zoomed => '500x500>' },
59
+ :editorials => { :fullsize => '150x100>' },
60
+ 'User' => { :avatar => '64x64!' }
61
+ }
62
+ >>>>>>> 33222f02ee9657d0ea9e4654b06cea7ed49cb85b
63
+ end
64
+
65
+ class FileAttachment < ActiveRecord::Base
66
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files', :processor => :rmagick
67
+ validates_as_attachment
68
+ end
69
+
70
+ class FileAttachmentWithStringId < ActiveRecord::Base
71
+ set_table_name 'file_attachments_with_string_id'
72
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files', :processor => :rmagick
73
+ validates_as_attachment
74
+
75
+ before_validation :auto_generate_id
76
+ before_save :auto_generate_id
77
+ @@last_id = 0
78
+
79
+ private
80
+ def auto_generate_id
81
+ @@last_id += 1
82
+ self.id = "id_#{@@last_id}"
83
+ end
84
+ end
85
+
86
+ class FileAttachmentWithUuid < ActiveRecord::Base
87
+ set_table_name 'file_attachments_with_string_id'
88
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files', :processor => :rmagick, :uuid_primary_key => true
89
+ validates_as_attachment
90
+
91
+ before_validation :auto_generate_id
92
+ before_save :auto_generate_id
93
+ @@last_id = 0
94
+
95
+ private
96
+ def auto_generate_id
97
+ @@last_id += 1
98
+ self.id = "%0127dx" % @@last_id
99
+ end
100
+ end
101
+
102
+ class ImageFileAttachment < FileAttachment
103
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
104
+ :content_type => :image, :resize_to => [50,50]
105
+ end
106
+
107
+ class ImageWithThumbsFileAttachment < FileAttachment
108
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
109
+ :thumbnails => { :thumb => [50, 50], :geometry => 'x50' }, :resize_to => [55,55]
110
+ <<<<<<< HEAD
111
+ def after_resize(img)
112
+ self.aspect_ratio = img.columns.to_f / img.rows.to_f
113
+ end
114
+ =======
115
+ # after_resize do |record, img|
116
+ # record.aspect_ratio = img.columns.to_f / img.rows.to_f
117
+ # end
118
+ >>>>>>> 33222f02ee9657d0ea9e4654b06cea7ed49cb85b
119
+ end
120
+
121
+ class ImageWithThumbsClassFileAttachment < FileAttachment
122
+ # use file_system_path to test backwards compatibility
123
+ has_attachment :file_system_path => 'vendor/plugins/attachment_fu/test/files',
124
+ :thumbnails => { :thumb => [50, 50] }, :resize_to => [55,55],
125
+ :thumbnail_class => 'ImageThumbnail'
126
+ end
127
+
128
+ class ImageThumbnail < FileAttachment
129
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files/thumbnails'
130
+ end
131
+
132
+ # no parent
133
+ class OrphanAttachment < ActiveRecord::Base
134
+ has_attachment :processor => :rmagick
135
+ validates_as_attachment
136
+ end
137
+
138
+ # no filename, no size, no content_type
139
+ class MinimalAttachment < ActiveRecord::Base
140
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files', :processor => :rmagick
141
+ validates_as_attachment
142
+
143
+ def filename
144
+ "#{id}.file"
145
+ end
146
+ end
147
+
148
+ begin
149
+ class ImageScienceAttachment < ActiveRecord::Base
150
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
151
+ :processor => :image_science, :thumbnails => { :thumb => [50, 51], :geometry => '31>', :aspect => '25x25!' }, :resize_to => 55
152
+ end
153
+
154
+ class ImageScienceLowerQualityAttachment < ActiveRecord::Base
155
+ set_table_name 'image_science_attachments'
156
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
157
+ :processor => :image_science, :thumbnails => { :thumb => [50, 51], :geometry => '31>', :aspect => '25x25!' }, :resize_to => 55,
158
+ :jpeg_quality => 75
159
+ end
160
+
161
+ class ImageScienceWithPerThumbJpegAttachment < ImageScienceAttachment
162
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
163
+ :processor => :image_science,
164
+ :resize_to => '100x100',
165
+ :thumbnails => { :thumb => [50, 50], :editorial => '300x120', :avatar => '64x64!' },
166
+ :jpeg_quality => { :thumb => 90, '<5000' => 80, '>=5000' => 75 }
167
+ end
168
+ rescue MissingSourceFile
169
+ puts $!.message
170
+ puts "no ImageScience"
171
+ end
172
+
173
+ begin
174
+ class CoreImageAttachment < ActiveRecord::Base
175
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
176
+ :processor => :core_image, :thumbnails => { :thumb => [50, 51], :geometry => '31>', :aspect => '25x25!' }, :resize_to => 55
177
+ end
178
+
179
+ class LowerQualityCoreImageAttachment < CoreImageAttachment
180
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
181
+ :processor => :core_image, :thumbnails => { :thumb => [50, 51], :geometry => '31>', :aspect => '25x25!' }, :resize_to => 55,
182
+ :jpeg_quality => 50
183
+ end
184
+
185
+ class CoreImageWithPerThumbJpegAttachment < CoreImageAttachment
186
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
187
+ :processor => :core_image,
188
+ :resize_to => '100x100',
189
+ :thumbnails => { :thumb => [50, 50], :editorial => '300x120', :avatar => '64x64!' },
190
+ :jpeg_quality => { :thumb => 90, '<5000' => 80, '>=5000' => 75 }
191
+ end
192
+ rescue MissingSourceFile
193
+ puts $!.message
194
+ puts "no CoreImage"
195
+ end
196
+
197
+ begin
198
+ class MiniMagickAttachment < ActiveRecord::Base
199
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
200
+ :processor => :mini_magick, :thumbnails => { :thumb => [50, 51], :geometry => '31>', :aspect => '25x25!' }, :resize_to => 55
201
+ end
202
+
203
+ class ImageThumbnailCrop < MiniMagickAttachment
204
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
205
+ :thumbnails => { :square => "50x50c", :vertical => "30x60c", :horizontal => "60x30c"}
206
+
207
+ # TODO this is a bad duplication, this method is in the MiniMagick Processor
208
+ def self.calculate_offset(image_width,image_height,image_aspect,thumb_width,thumb_height,thumb_aspect)
209
+ # only crop if image is not smaller in both dimensions
210
+
211
+ # special cases, image smaller in one dimension then thumbsize
212
+ if image_width < thumb_width
213
+ offset = (image_height / 2) - (thumb_height / 2)
214
+ command = "#{image_width}x#{thumb_height}+0+#{offset}"
215
+ elsif image_height < thumb_height
216
+ offset = (image_width / 2) - (thumb_width / 2)
217
+ command = "#{thumb_width}x#{image_height}+#{offset}+0"
218
+
219
+ # normal thumbnail generation
220
+ # calculate height and offset y, width is fixed
221
+ elsif (image_aspect <= thumb_aspect or image_width < thumb_width) and image_height > thumb_height
222
+ height = image_width / thumb_aspect
223
+ offset = (image_height / 2) - (height / 2)
224
+ command = "#{image_width}x#{height}+0+#{offset}"
225
+ # calculate width and offset x, height is fixed
226
+ else
227
+ width = image_height * thumb_aspect
228
+ offset = (image_width / 2) - (width / 2)
229
+ command = "#{width}x#{image_height}+#{offset}+0"
230
+ end
231
+ # crop image
232
+ command
233
+ end
234
+ end
235
+
236
+ class LowerQualityMiniMagickAttachment < ActiveRecord::Base
237
+ set_table_name 'mini_magick_attachments'
238
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
239
+ :processor => :mini_magick, :thumbnails => { :thumb => [50, 51], :geometry => '31>', :aspect => '25x25!' }, :resize_to => 55,
240
+ :jpeg_quality => 50
241
+ end
242
+
243
+ class MiniMagickWithPerThumbJpegAttachment < MiniMagickAttachment
244
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
245
+ :processor => :mini_magick,
246
+ :resize_to => '100x100',
247
+ :thumbnails => { :thumb => [50, 50], :editorial => '300x120', :avatar => '64x64!' },
248
+ :jpeg_quality => { :thumb => 90, '<5000' => 80, '>=5000' => 75 }
249
+ end
250
+
251
+ rescue MissingSourceFile
252
+ puts $!.message
253
+ puts "no Mini Magick"
254
+ end
255
+
256
+ begin
257
+ class GD2Attachment < ActiveRecord::Base
258
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
259
+ :processor => :gd2, :thumbnails => { :thumb => [50, 51], :geometry => '31>', :aspect => '25x25!' }, :resize_to => 55
260
+ end
261
+
262
+ class LowerQualityGD2Attachment < GD2Attachment
263
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
264
+ :processor => :gd2, :thumbnails => { :thumb => [50, 51], :geometry => '31>', :aspect => '25x25!' }, :resize_to => 55,
265
+ :jpeg_quality => 50
266
+ end
267
+
268
+ class GD2WithPerThumbJpegAttachment < GD2Attachment
269
+ has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
270
+ :processor => :gd2,
271
+ :resize_to => '100x100',
272
+ :thumbnails => { :thumb => [50, 50], :editorial => '300x120', :avatar => '64x64!' },
273
+ :jpeg_quality => { :thumb => 90, '<5000' => 80, '>=5000' => 75 }
274
+ end
275
+ rescue MissingSourceFile
276
+ puts $!.message
277
+ puts "no GD2"
278
+ end
279
+
280
+
281
+ begin
282
+ class S3Attachment < ActiveRecord::Base
283
+ has_attachment :storage => :s3, :processor => :rmagick, :s3_config_path => File.join(File.dirname(__FILE__), '../amazon_s3.yml')
284
+ validates_as_attachment
285
+ end
286
+
287
+ class CloudFilesAttachment < ActiveRecord::Base
288
+ has_attachment :storage => :cloud_files, :processor => :rmagick, :cloudfiles_config_path => File.join(File.dirname(__FILE__), '../rackspace_cloudfiles.yml')
289
+ validates_as_attachment
290
+ end
291
+
292
+ class S3WithPathPrefixAttachment < S3Attachment
293
+ has_attachment :storage => :s3, :path_prefix => 'some/custom/path/prefix', :processor => :rmagick
294
+ validates_as_attachment
295
+ end
296
+
297
+ class CloudFilesWithPathPrefixAttachment < CloudFilesAttachment
298
+ has_attachment :storage => :cloud_files, :path_prefix => 'some/custom/path/prefix', :processor => :rmagick
299
+ validates_as_attachment
300
+ end
301
+
302
+ rescue
303
+ puts "S3 error: #{$!}"
304
+ end
Binary file
@@ -0,0 +1 @@
1
+ foo
Binary file
Binary file
@@ -0,0 +1,114 @@
1
+ require 'test/unit'
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/geometry')) unless Object.const_defined?(:Geometry)
3
+
4
+ class GeometryTest < Test::Unit::TestCase
5
+ def test_should_resize
6
+ assert_geometry 50, 64,
7
+ "50x50" => [39, 50],
8
+ "60x60" => [47, 60],
9
+ "100x100" => [78, 100]
10
+ end
11
+
12
+ def test_should_resize_no_width
13
+ assert_geometry 50, 64,
14
+ "x50" => [39, 50],
15
+ "x60" => [47, 60],
16
+ "x100" => [78, 100]
17
+ end
18
+
19
+ def test_should_resize_no_height
20
+ assert_geometry 50, 64,
21
+ "50" => [50, 64],
22
+ "60" => [60, 77],
23
+ "100" => [100, 128]
24
+ end
25
+
26
+ def test_should_resize_no_height_with_x
27
+ assert_geometry 50, 64,
28
+ "50x" => [50, 64],
29
+ "60x" => [60, 77],
30
+ "100x" => [100, 128]
31
+ end
32
+
33
+ def test_should_resize_with_percent
34
+ assert_geometry 50, 64,
35
+ "50x50%" => [25, 32],
36
+ "60x60%" => [30, 38],
37
+ "120x112%" => [60, 72]
38
+ end
39
+
40
+ def test_should_resize_with_percent_and_no_width
41
+ assert_geometry 50, 64,
42
+ "x50%" => [50, 32],
43
+ "x60%" => [50, 38],
44
+ "x112%" => [50, 72]
45
+ end
46
+
47
+ def test_should_resize_with_percent_and_no_height
48
+ assert_geometry 50, 64,
49
+ "50%" => [25, 32],
50
+ "60%" => [30, 38],
51
+ "120%" => [60, 77]
52
+ end
53
+
54
+ def test_should_resize_with_less
55
+ assert_geometry 50, 64,
56
+ "50x50<" => [50, 64],
57
+ "60x60<" => [50, 64],
58
+ "100x100<" => [78, 100],
59
+ "100x112<" => [88, 112],
60
+ "40x70<" => [50, 64]
61
+ end
62
+
63
+ def test_should_resize_with_less_and_no_width
64
+ assert_geometry 50, 64,
65
+ "x50<" => [50, 64],
66
+ "x60<" => [50, 64],
67
+ "x100<" => [78, 100]
68
+ end
69
+
70
+ def test_should_resize_with_less_and_no_height
71
+ assert_geometry 50, 64,
72
+ "50<" => [50, 64],
73
+ "60<" => [60, 77],
74
+ "100<" => [100, 128]
75
+ end
76
+
77
+ def test_should_resize_with_greater
78
+ assert_geometry 50, 64,
79
+ "50x50>" => [39, 50],
80
+ "60x60>" => [47, 60],
81
+ "100x100>" => [50, 64],
82
+ "100x112>" => [50, 64],
83
+ "40x70>" => [40, 51]
84
+ end
85
+
86
+ def test_should_resize_with_greater_and_no_width
87
+ assert_geometry 50, 64,
88
+ "x40>" => [31, 40],
89
+ "x60>" => [47, 60],
90
+ "x100>" => [50, 64]
91
+ end
92
+
93
+ def test_should_resize_with_greater_and_no_height
94
+ assert_geometry 50, 64,
95
+ "40>" => [40, 51],
96
+ "60>" => [50, 64],
97
+ "100>" => [50, 64]
98
+ end
99
+
100
+ def test_should_resize_with_aspect
101
+ assert_geometry 50, 64,
102
+ "35x35!" => [35, 35],
103
+ "70x70!" => [70, 70]
104
+ end
105
+
106
+ protected
107
+ def assert_geometry(width, height, values)
108
+ values.each do |geo, result|
109
+ # run twice to verify the Geometry string isn't modified after a run
110
+ geo = Geometry.from_s(geo)
111
+ 2.times { assert_equal result, [width, height] / geo }
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,58 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'test_helper'))
2
+
3
+ class CoreImageTest < Test::Unit::TestCase
4
+ attachment_model CoreImageAttachment
5
+
6
+ if Object.const_defined?(:OSX)
7
+ def test_should_resize_image
8
+ attachment = upload_file :filename => '/files/rails.png'
9
+ assert_valid attachment
10
+ assert attachment.image?
11
+ # test core image thumbnail
12
+ assert_equal 42, attachment.width
13
+ assert_equal 55, attachment.height
14
+
15
+ thumb = attachment.thumbnails.detect { |t| t.filename =~ /_thumb/ }
16
+ geo = attachment.thumbnails.detect { |t| t.filename =~ /_geometry/ }
17
+ aspect = attachment.thumbnails.detect { |t| t.filename =~ /_aspect/ }
18
+
19
+ # test exact resize dimensions
20
+ assert_equal 50, thumb.width
21
+ assert_equal 51, thumb.height
22
+
23
+ # test geometry strings
24
+ assert_equal 31, geo.width
25
+ assert_equal 41, geo.height
26
+ assert_equal 25, aspect.width
27
+ assert_equal 25, aspect.height
28
+
29
+ # This makes sure that we didn't overwrite the original file
30
+ # and will end up with a thumbnail instead of the original
31
+ assert_equal 42, attachment.width
32
+ assert_equal 55, attachment.height
33
+
34
+ end
35
+
36
+ def test_should_handle_jpeg_quality
37
+ attachment_model CoreImageAttachment
38
+ attachment = upload_file :filename => '/files/rails.jpg', :content_type => 'image/jpeg'
39
+ full_size = attachment.size
40
+ attachment_model LowerQualityCoreImageAttachment
41
+ attachment = upload_file :filename => '/files/rails.jpg', :content_type => 'image/jpeg'
42
+ lq_size = attachment.size
43
+ assert lq_size <= full_size * 0.9, 'Lower-quality JPEG filesize should be congruently smaller'
44
+
45
+ # FIXME: wait for Marcus' reply to determine whether I can get exact-quality output or need to adjust for CoreImage.
46
+ # attachment_model CoreImageWithPerThumbJpegAttachment
47
+ # attachment = upload_file :filename => '/files/rails.jpg', :content_type => 'image/jpeg'
48
+ # assert_file_jpeg_quality attachment, :thumb, 90
49
+ # assert_file_jpeg_quality attachment, :avatar, 80
50
+ # assert_file_jpeg_quality attachment, :editorial, 75
51
+ # assert_file_jpeg_quality attachment, nil, 75
52
+ end
53
+ else
54
+ def test_flunk
55
+ puts "CoreImage not loaded, tests not running"
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,51 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'test_helper'))
2
+
3
+ class GD2Test < Test::Unit::TestCase
4
+ attachment_model GD2Attachment
5
+
6
+ if Object.const_defined?(:GD2)
7
+ def test_should_resize_image
8
+ attachment = upload_file :filename => '/files/rails.png'
9
+ assert_valid attachment
10
+ assert attachment.image?
11
+ # test gd2 thumbnail
12
+ assert_equal 43, attachment.width
13
+ assert_equal 55, attachment.height
14
+
15
+ thumb = attachment.thumbnails.detect { |t| t.filename =~ /_thumb/ }
16
+ geo = attachment.thumbnails.detect { |t| t.filename =~ /_geometry/ }
17
+ aspect = attachment.thumbnails.detect { |t| t.filename =~ /_aspect/ }
18
+
19
+ # test exact resize dimensions
20
+ assert_equal 50, thumb.width
21
+ assert_equal 51, thumb.height
22
+
23
+ # test geometry strings
24
+ assert_equal 31, geo.width
25
+ assert_equal 40, geo.height
26
+ assert_equal 25, aspect.width
27
+ assert_equal 25, aspect.height
28
+ end
29
+
30
+ def test_should_handle_jpeg_quality
31
+ attachment_model GD2Attachment
32
+ attachment = upload_file :filename => '/files/rails.jpg', :content_type => 'image/jpeg'
33
+ full_size = attachment.size
34
+ attachment_model LowerQualityGD2Attachment
35
+ attachment = upload_file :filename => '/files/rails.jpg', :content_type => 'image/jpeg'
36
+ lq_size = attachment.size
37
+ assert lq_size <= full_size * 0.9, 'Lower-quality JPEG filesize should be congruently smaller'
38
+
39
+ attachment_model GD2WithPerThumbJpegAttachment
40
+ attachment = upload_file :filename => '/files/rails.jpg', :content_type => 'image/jpeg'
41
+ assert_file_jpeg_quality attachment, :thumb, 90
42
+ assert_file_jpeg_quality attachment, :avatar, 80
43
+ assert_file_jpeg_quality attachment, :editorial, 75
44
+ assert_file_jpeg_quality attachment, nil, 75
45
+ end
46
+ else
47
+ def test_flunk
48
+ puts "GD2 not loaded, tests not running"
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,54 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'test_helper'))
2
+
3
+ class ImageScienceTest < Test::Unit::TestCase
4
+ attachment_model ImageScienceAttachment
5
+
6
+ if Object.const_defined?(:ImageScience)
7
+ def test_should_resize_image
8
+ attachment = upload_file :filename => '/files/rails.png'
9
+ assert_valid attachment
10
+ assert attachment.image?
11
+ # test image science thumbnail
12
+ assert_equal 42, attachment.width
13
+ assert_equal 55, attachment.height
14
+
15
+ thumb = attachment.thumbnails.detect { |t| t.filename =~ /_thumb/ }
16
+ geo = attachment.thumbnails.detect { |t| t.filename =~ /_geometry/ }
17
+ aspect = attachment.thumbnails.detect { |t| t.filename =~ /_aspect/ }
18
+
19
+ # test exact resize dimensions
20
+ assert_equal 50, thumb.width
21
+ assert_equal 51, thumb.height
22
+
23
+ # test geometry strings
24
+ assert_equal 31, geo.width
25
+ assert_equal 41, geo.height
26
+ assert_equal 25, aspect.width
27
+ assert_equal 25, aspect.height
28
+ end
29
+
30
+ def test_should_handle_jpeg_quality
31
+ attachment = upload_file :filename => '/files/rails.jpg', :content_type => 'image/jpeg'
32
+ full_size = attachment.size
33
+ attachment_model ImageScienceLowerQualityAttachment
34
+ attachment = upload_file :filename => '/files/rails.jpg', :content_type => 'image/jpeg'
35
+ lq_size = attachment.size
36
+ if ImageScience.instance_method(:save).arity == -2 # tdd-image_science: JPEG quality processing
37
+ assert lq_size <= full_size * 0.75, 'Lower-quality JPEG filesize should be congruently smaller'
38
+ else
39
+ assert_equal full_size, lq_size, 'Unsupported lower-quality JPEG should yield exact same file size'
40
+ end
41
+
42
+ attachment_model ImageScienceWithPerThumbJpegAttachment
43
+ attachment = upload_file :filename => '/files/rails.jpg', :content_type => 'image/jpeg'
44
+ assert_file_jpeg_quality attachment, :thumb, 90
45
+ assert_file_jpeg_quality attachment, :avatar, 80
46
+ assert_file_jpeg_quality attachment, :editorial, 75
47
+ assert_file_jpeg_quality attachment, nil, 75
48
+ end
49
+ else
50
+ def test_flunk
51
+ puts "ImageScience not loaded, tests not running"
52
+ end
53
+ end
54
+ end