dm-paperclip-r3 2.4.1
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/LICENSE +26 -0
- data/README.rdoc +118 -0
- data/Rakefile +104 -0
- data/init.rb +1 -0
- data/lib/dm-paperclip/attachment.rb +416 -0
- data/lib/dm-paperclip/callback_compatability.rb +33 -0
- data/lib/dm-paperclip/geometry.rb +117 -0
- data/lib/dm-paperclip/interpolations.rb +123 -0
- data/lib/dm-paperclip/iostream.rb +46 -0
- data/lib/dm-paperclip/processor.rb +49 -0
- data/lib/dm-paperclip/storage.rb +257 -0
- data/lib/dm-paperclip/thumbnail.rb +70 -0
- data/lib/dm-paperclip/upfile.rb +47 -0
- data/lib/dm-paperclip/validations.rb +124 -0
- data/lib/dm-paperclip.rb +369 -0
- data/tasks/paperclip_tasks.rake +38 -0
- data/test/attachment_test.rb +361 -0
- data/test/fixtures/12k.png +0 -0
- data/test/fixtures/50x50.png +0 -0
- data/test/fixtures/5k.png +0 -0
- data/test/fixtures/bad.png +1 -0
- data/test/fixtures/text.txt +0 -0
- data/test/geometry_test.rb +142 -0
- data/test/helper.rb +72 -0
- data/test/integration_test.rb +396 -0
- data/test/iostream_test.rb +78 -0
- data/test/paperclip_test.rb +163 -0
- data/test/storage_test.rb +324 -0
- data/test/thumbnail_test.rb +147 -0
- metadata +181 -0
@@ -0,0 +1,361 @@
|
|
1
|
+
require 'test/helper'
|
2
|
+
|
3
|
+
class Dummy
|
4
|
+
# This is a dummy class
|
5
|
+
end
|
6
|
+
|
7
|
+
class AttachmentTest < Test::Unit::TestCase
|
8
|
+
context "Attachment default_options" do
|
9
|
+
setup do
|
10
|
+
rebuild_model
|
11
|
+
@old_default_options = Paperclip::Attachment.default_options.dup
|
12
|
+
@new_default_options = @old_default_options.merge({
|
13
|
+
:path => "argle/bargle",
|
14
|
+
:url => "fooferon",
|
15
|
+
:default_url => "not here.png"
|
16
|
+
})
|
17
|
+
end
|
18
|
+
|
19
|
+
teardown do
|
20
|
+
Paperclip::Attachment.default_options.merge! @old_default_options
|
21
|
+
end
|
22
|
+
|
23
|
+
should "be overrideable" do
|
24
|
+
Paperclip::Attachment.default_options.merge!(@new_default_options)
|
25
|
+
@new_default_options.keys.each do |key|
|
26
|
+
assert_equal @new_default_options[key],
|
27
|
+
Paperclip::Attachment.default_options[key]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "without an Attachment" do
|
32
|
+
setup do
|
33
|
+
@dummy = Dummy.new
|
34
|
+
end
|
35
|
+
|
36
|
+
should "return false when asked exists?" do
|
37
|
+
assert !@dummy.avatar.exists?
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "on an Attachment" do
|
42
|
+
setup do
|
43
|
+
@dummy = Dummy.new
|
44
|
+
@attachment = @dummy.avatar
|
45
|
+
end
|
46
|
+
|
47
|
+
Paperclip::Attachment.default_options.keys.each do |key|
|
48
|
+
should "be the default_options for #{key}" do
|
49
|
+
assert_equal @old_default_options[key],
|
50
|
+
@attachment.instance_variable_get("@#{key}"),
|
51
|
+
key
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "when redefined" do
|
56
|
+
setup do
|
57
|
+
Paperclip::Attachment.default_options.merge!(@new_default_options)
|
58
|
+
@dummy = Dummy.new
|
59
|
+
@attachment = @dummy.avatar
|
60
|
+
end
|
61
|
+
|
62
|
+
Paperclip::Attachment.default_options.keys.each do |key|
|
63
|
+
should "be the new default_options for #{key}" do
|
64
|
+
assert_equal @new_default_options[key],
|
65
|
+
@attachment.instance_variable_get("@#{key}"),
|
66
|
+
key
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context "An attachment with similarly named interpolations" do
|
74
|
+
setup do
|
75
|
+
rebuild_model :path => ":id.omg/:id-bbq/:idwhat/:id_partition.wtf"
|
76
|
+
@dummy = Dummy.new
|
77
|
+
@dummy.stubs(:id).returns(1024)
|
78
|
+
@file = File.new(File.join(File.dirname(__FILE__),
|
79
|
+
"fixtures",
|
80
|
+
"5k.png"))
|
81
|
+
@dummy.avatar = @file
|
82
|
+
end
|
83
|
+
|
84
|
+
should "make sure that they are interpolated correctly" do
|
85
|
+
assert_equal "1024.omg/1024-bbq/1024what/000/001/024.wtf", @dummy.avatar.path
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context "An attachment with a :rails_env interpolation" do
|
90
|
+
setup do
|
91
|
+
@rails_env = "blah"
|
92
|
+
@id = 1024
|
93
|
+
rebuild_model :path => ":merb_env/:id.png"
|
94
|
+
@dummy = Dummy.new
|
95
|
+
@dummy.stubs(:id).returns(@id)
|
96
|
+
@file = File.new(File.join(File.dirname(__FILE__),
|
97
|
+
"fixtures",
|
98
|
+
"5k.png"))
|
99
|
+
@dummy.avatar = @file
|
100
|
+
end
|
101
|
+
|
102
|
+
should "return the proper path" do
|
103
|
+
temporary_env(@rails_env) {
|
104
|
+
assert_equal "#{Merb.env}/#{@id}.png", @dummy.avatar.path
|
105
|
+
}
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context "An attachment with :convert_options" do
|
110
|
+
setup do
|
111
|
+
rebuild_model :styles => {
|
112
|
+
:thumb => "100x100",
|
113
|
+
:large => "400x400"
|
114
|
+
},
|
115
|
+
:convert_options => {
|
116
|
+
:all => "-do_stuff",
|
117
|
+
:thumb => "-thumbnailize"
|
118
|
+
}
|
119
|
+
@dummy = Dummy.new
|
120
|
+
end
|
121
|
+
|
122
|
+
should "report the correct options when sent #extra_options_for(:thumb)" do
|
123
|
+
assert_equal "-thumbnailize -do_stuff", @dummy.avatar.send(:extra_options_for, :thumb), @dummy.avatar.convert_options.inspect
|
124
|
+
end
|
125
|
+
|
126
|
+
should "report the correct options when sent #extra_options_for(:large)" do
|
127
|
+
assert_equal "-do_stuff", @dummy.avatar.send(:extra_options_for, :large)
|
128
|
+
end
|
129
|
+
|
130
|
+
context "when given a file" do
|
131
|
+
setup do
|
132
|
+
@file = File.new(File.join(File.dirname(__FILE__),
|
133
|
+
"fixtures",
|
134
|
+
"5k.png"))
|
135
|
+
Paperclip::Thumbnail.stubs(:make)
|
136
|
+
[:thumb, :large].each do |style|
|
137
|
+
@dummy.avatar.stubs(:extra_options_for).with(style)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
should "call post_process" do
|
142
|
+
@dummy.avatar.expects(:post_process).once
|
143
|
+
@dummy.avatar = @file
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
context "Assigning an attachment" do
|
149
|
+
setup do
|
150
|
+
rebuild_model
|
151
|
+
|
152
|
+
@tempfile = mock
|
153
|
+
@tempfile.expects(:size).returns(10)
|
154
|
+
|
155
|
+
@not_file = mock
|
156
|
+
@not_file.stubs(:nil?).returns(false)
|
157
|
+
@not_file.expects(:to_tempfile).returns(@tempfile)
|
158
|
+
@not_file.expects(:original_filename).returns("filename.png\r\n")
|
159
|
+
@not_file.expects(:content_type).returns("image/png\r\n")
|
160
|
+
@not_file.expects(:size).returns(10)
|
161
|
+
|
162
|
+
@dummy = Dummy.new
|
163
|
+
@attachment = @dummy.avatar
|
164
|
+
@attachment.expects(:valid_assignment?).with(@not_file).returns(true)
|
165
|
+
@attachment.expects(:queue_existing_for_delete)
|
166
|
+
@attachment.expects(:post_process)
|
167
|
+
@attachment.expects(:validate).twice
|
168
|
+
@dummy.avatar = @not_file
|
169
|
+
end
|
170
|
+
|
171
|
+
should "strip whitespace from original_filename field" do
|
172
|
+
assert_equal "filename.png", @dummy.avatar.original_filename
|
173
|
+
end
|
174
|
+
|
175
|
+
should "strip whitespace from content_type field" do
|
176
|
+
assert_equal "image/png", @dummy.avatar.instance.avatar_content_type
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
context "Attachment with strange letters" do
|
181
|
+
setup do
|
182
|
+
rebuild_model
|
183
|
+
|
184
|
+
@tempfile = mock
|
185
|
+
@tempfile.expects(:size).returns(10)
|
186
|
+
|
187
|
+
@not_file = mock
|
188
|
+
@not_file.stubs(:nil?).returns(false)
|
189
|
+
@not_file.expects(:to_tempfile).returns(@tempfile)
|
190
|
+
@not_file.expects(:original_filename).returns("sheep_say_b_.png\r\n")
|
191
|
+
@not_file.expects(:content_type).returns("image/png\r\n")
|
192
|
+
@not_file.expects(:size).returns(10)
|
193
|
+
|
194
|
+
@dummy = Dummy.new
|
195
|
+
@attachment = @dummy.avatar
|
196
|
+
@attachment.expects(:valid_assignment?).with(@not_file).returns(true)
|
197
|
+
@attachment.expects(:queue_existing_for_delete)
|
198
|
+
@attachment.expects(:post_process)
|
199
|
+
@attachment.expects(:validate).twice
|
200
|
+
@dummy.avatar = @not_file
|
201
|
+
end
|
202
|
+
|
203
|
+
should "remove strange letters and replace with underscore (_)" do
|
204
|
+
assert_equal "sheep_say_b_.png", @dummy.avatar.original_filename
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
context "An attachment" do
|
209
|
+
setup do
|
210
|
+
Paperclip::Attachment.default_options.merge!({
|
211
|
+
:path => ":merb_root/tmp/:attachment/:class/:style/:id/:basename.:extension"
|
212
|
+
})
|
213
|
+
FileUtils.rm_rf("tmp")
|
214
|
+
rebuild_model
|
215
|
+
@instance = Dummy.new
|
216
|
+
@instance.stubs(:id).returns(1024)
|
217
|
+
@attachment = Paperclip::Attachment.new(:avatar, @instance)
|
218
|
+
@file = File.new(File.join(File.dirname(__FILE__),
|
219
|
+
"fixtures",
|
220
|
+
"5k.png"))
|
221
|
+
end
|
222
|
+
|
223
|
+
should "raise if there are not the correct columns when you try to assign" do
|
224
|
+
@other_attachment = Paperclip::Attachment.new(:not_here, @instance)
|
225
|
+
assert_raises(Paperclip::PaperclipError) do
|
226
|
+
@other_attachment.assign(@file)
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
should "return its default_url when no file assigned" do
|
231
|
+
assert @attachment.to_file.nil?
|
232
|
+
assert_equal "/avatars/original/missing.png", @attachment.url
|
233
|
+
assert_equal "/avatars/blah/missing.png", @attachment.url(:blah)
|
234
|
+
end
|
235
|
+
|
236
|
+
context "with a file assigned in the database" do
|
237
|
+
setup do
|
238
|
+
@instance.stubs(:avatar_file_name).returns('5k.png')
|
239
|
+
@instance.stubs(:avatar_content_type).returns("image/png")
|
240
|
+
@instance.stubs(:avatar_file_size).returns(12345)
|
241
|
+
@now = Time.now
|
242
|
+
Time.stubs(:now).returns(@now)
|
243
|
+
@instance.stubs(:avatar_updated_at).returns(Time.now)
|
244
|
+
end
|
245
|
+
|
246
|
+
should "return a correct url even if the file does not exist" do
|
247
|
+
assert_nil @attachment.to_file
|
248
|
+
assert_match %r{^/system/avatars/#{@instance.id}/blah/5k\.png}, @attachment.url(:blah)
|
249
|
+
end
|
250
|
+
|
251
|
+
should "make sure the updated_at mtime is in the url if it is defined" do
|
252
|
+
assert_match %r{#{@now.to_i.to_s}$}, @attachment.url(:blah)
|
253
|
+
end
|
254
|
+
|
255
|
+
context "with the updated_at field removed" do
|
256
|
+
setup do
|
257
|
+
@instance.stubs(:[]).with(:avatar_updated_at).returns(nil)
|
258
|
+
end
|
259
|
+
|
260
|
+
should "only return the url without the updated_at when sent #url" do
|
261
|
+
assert_match "/avatars/#{@instance.id}/blah/5k.png", @attachment.url(:blah)
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
should "return the proper path when filename has a single .'s" do
|
266
|
+
assert_equal File.expand_path("./test/../tmp/avatars/dummies/original/#{@instance.id}/5k.png"), File.expand_path(@attachment.path)
|
267
|
+
end
|
268
|
+
|
269
|
+
should "return the proper path when filename has multiple .'s" do
|
270
|
+
@instance.stubs(:avatar_file_name).returns("5k.old.png")
|
271
|
+
assert_equal File.expand_path("./test/../tmp/avatars/dummies/original/#{@instance.id}/5k.old.png"), File.expand_path(@attachment.path)
|
272
|
+
end
|
273
|
+
|
274
|
+
context "when expecting three styles" do
|
275
|
+
setup do
|
276
|
+
styles = {:styles => { :large => ["400x400", :png],
|
277
|
+
:medium => ["100x100", :gif],
|
278
|
+
:small => ["32x32#", :jpg]}}
|
279
|
+
@attachment = Paperclip::Attachment.new(:avatar,
|
280
|
+
@instance,
|
281
|
+
styles)
|
282
|
+
end
|
283
|
+
|
284
|
+
context "and assigned a file" do
|
285
|
+
setup do
|
286
|
+
now = Time.now
|
287
|
+
Time.stubs(:now).returns(now)
|
288
|
+
@attachment.assign(@file)
|
289
|
+
end
|
290
|
+
|
291
|
+
should "be dirty" do
|
292
|
+
assert @attachment.dirty?
|
293
|
+
end
|
294
|
+
|
295
|
+
context "and saved" do
|
296
|
+
setup do
|
297
|
+
@attachment.save
|
298
|
+
end
|
299
|
+
|
300
|
+
should "return the real url" do
|
301
|
+
assert @attachment.to_file
|
302
|
+
assert_match %r{^/system/avatars/#{@instance.id}/original/5k\.png}, @attachment.url
|
303
|
+
assert_match %r{^/system/avatars/#{@instance.id}/small/5k\.jpg}, @attachment.url(:small)
|
304
|
+
end
|
305
|
+
|
306
|
+
should "commit the files to disk" do
|
307
|
+
[:large, :medium, :small].each do |style|
|
308
|
+
io = @attachment.to_file(style)
|
309
|
+
assert File.exists?(io)
|
310
|
+
assert ! io.is_a?(::Tempfile)
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
should "save the files as the right formats and sizes" do
|
315
|
+
[[:large, 400, 61, "PNG"],
|
316
|
+
[:medium, 100, 15, "GIF"],
|
317
|
+
[:small, 32, 32, "JPEG"]].each do |style|
|
318
|
+
cmd = "identify -format '%w %h %b %m' " +
|
319
|
+
"#{@attachment.path(style.first)}"
|
320
|
+
out = `#{cmd}`
|
321
|
+
width, height, size, format = out.split(" ")
|
322
|
+
assert_equal style[1].to_s, width.to_s
|
323
|
+
assert_equal style[2].to_s, height.to_s
|
324
|
+
assert_equal style[3].to_s, format.to_s
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
328
|
+
should "still have its #file attribute not be nil" do
|
329
|
+
assert ! @attachment.to_file.nil?
|
330
|
+
end
|
331
|
+
|
332
|
+
context "and deleted" do
|
333
|
+
setup do
|
334
|
+
@existing_names = @attachment.styles.keys.collect do |style|
|
335
|
+
@attachment.path(style)
|
336
|
+
end
|
337
|
+
@attachment.assign nil
|
338
|
+
@attachment.save
|
339
|
+
end
|
340
|
+
|
341
|
+
should "delete the files" do
|
342
|
+
@existing_names.each { |f| assert !File.exists?(f) }
|
343
|
+
end
|
344
|
+
end
|
345
|
+
end
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
end
|
350
|
+
|
351
|
+
context "when trying a nonexistant storage type" do
|
352
|
+
setup do
|
353
|
+
rebuild_model :storage => :not_here
|
354
|
+
end
|
355
|
+
|
356
|
+
should "not be able to find the module" do
|
357
|
+
assert_raise(NameError){ Dummy.new.avatar }
|
358
|
+
end
|
359
|
+
end
|
360
|
+
end
|
361
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
This is not an image.
|
File without changes
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'shoulda'
|
4
|
+
|
5
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'dm-paperclip', 'geometry.rb')
|
6
|
+
|
7
|
+
class GeometryTest < Test::Unit::TestCase
|
8
|
+
context "Paperclip::Geometry" do
|
9
|
+
should "correctly report its given dimensions" do
|
10
|
+
assert @geo = Paperclip::Geometry.new(1024, 768)
|
11
|
+
assert_equal 1024, @geo.width
|
12
|
+
assert_equal 768, @geo.height
|
13
|
+
end
|
14
|
+
|
15
|
+
should "correctly create a square if the height dimension is missing" do
|
16
|
+
assert @geo = Paperclip::Geometry.new(1024)
|
17
|
+
assert_equal 1024, @geo.width
|
18
|
+
assert_equal 1024, @geo.height
|
19
|
+
end
|
20
|
+
|
21
|
+
should "correctly create a square if the width dimension is missing" do
|
22
|
+
assert @geo = Paperclip::Geometry.new(nil, 768)
|
23
|
+
assert_equal 768, @geo.width
|
24
|
+
assert_equal 768, @geo.height
|
25
|
+
end
|
26
|
+
|
27
|
+
should "be generated from a WxH-formatted string" do
|
28
|
+
assert @geo = Paperclip::Geometry.parse("800x600")
|
29
|
+
assert_equal 800, @geo.width
|
30
|
+
assert_equal 600, @geo.height
|
31
|
+
end
|
32
|
+
|
33
|
+
should "be generated from a xH-formatted string" do
|
34
|
+
assert @geo = Paperclip::Geometry.parse("x600")
|
35
|
+
assert_equal 600, @geo.width
|
36
|
+
assert_equal 600, @geo.height
|
37
|
+
end
|
38
|
+
|
39
|
+
should "be generated from a Wx-formatted string" do
|
40
|
+
assert @geo = Paperclip::Geometry.parse("800x")
|
41
|
+
assert_equal 800, @geo.width
|
42
|
+
assert_equal 800, @geo.height
|
43
|
+
end
|
44
|
+
|
45
|
+
should "ensure the modifier is nil if only one dimension present" do
|
46
|
+
assert @geo = Paperclip::Geometry.parse("123x")
|
47
|
+
assert_nil @geo.modifier
|
48
|
+
end
|
49
|
+
|
50
|
+
should "ensure the modifier is nil if not present" do
|
51
|
+
assert @geo = Paperclip::Geometry.parse("123x456")
|
52
|
+
assert_nil @geo.modifier
|
53
|
+
end
|
54
|
+
|
55
|
+
['>', '<', '#', '@', '%', '^', '!'].each do |mod|
|
56
|
+
should "ensure the modifier #{mod} is preserved" do
|
57
|
+
assert @geo = Paperclip::Geometry.parse("123x456#{mod}")
|
58
|
+
assert_equal mod, @geo.modifier
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
should "make sure the modifier gets passed during transformation_to" do
|
63
|
+
assert @src = Paperclip::Geometry.parse("123x456")
|
64
|
+
assert @dst = Paperclip::Geometry.parse("123x456>")
|
65
|
+
assert_equal "123x456>", @src.transformation_to(@dst).join
|
66
|
+
end
|
67
|
+
|
68
|
+
should "be generated from a file" do
|
69
|
+
file = File.join(File.dirname(__FILE__), "fixtures", "5k.png")
|
70
|
+
file = File.new(file)
|
71
|
+
assert_nothing_raised{ @geo = Paperclip::Geometry.from_file(file) }
|
72
|
+
assert @geo.height > 0
|
73
|
+
assert @geo.width > 0
|
74
|
+
end
|
75
|
+
|
76
|
+
should "be generated from a file path" do
|
77
|
+
file = File.join(File.dirname(__FILE__), "fixtures", "5k.png")
|
78
|
+
assert_nothing_raised{ @geo = Paperclip::Geometry.from_file(file) }
|
79
|
+
assert @geo.height > 0
|
80
|
+
assert @geo.width > 0
|
81
|
+
end
|
82
|
+
|
83
|
+
should "not generate from a bad file" do
|
84
|
+
file = "/home/This File Does Not Exist.omg"
|
85
|
+
assert_raise(Paperclip::NotIdentifiedByImageMagickError){ @geo = Paperclip::Geometry.from_file(file) }
|
86
|
+
end
|
87
|
+
|
88
|
+
[['vertical', 900, 1440, true, false, false, 1440, 900, 0.625],
|
89
|
+
['horizontal', 1024, 768, false, true, false, 1024, 768, 1.3333],
|
90
|
+
['square', 100, 100, false, false, true, 100, 100, 1]].each do |args|
|
91
|
+
context "performing calculations on a #{args[0]} viewport" do
|
92
|
+
setup do
|
93
|
+
@geo = Paperclip::Geometry.new(args[1], args[2])
|
94
|
+
end
|
95
|
+
|
96
|
+
should "#{args[3] ? "" : "not"} be vertical" do
|
97
|
+
assert_equal args[3], @geo.vertical?
|
98
|
+
end
|
99
|
+
|
100
|
+
should "#{args[4] ? "" : "not"} be horizontal" do
|
101
|
+
assert_equal args[4], @geo.horizontal?
|
102
|
+
end
|
103
|
+
|
104
|
+
should "#{args[5] ? "" : "not"} be square" do
|
105
|
+
assert_equal args[5], @geo.square?
|
106
|
+
end
|
107
|
+
|
108
|
+
should "report that #{args[6]} is the larger dimension" do
|
109
|
+
assert_equal args[6], @geo.larger
|
110
|
+
end
|
111
|
+
|
112
|
+
should "report that #{args[7]} is the smaller dimension" do
|
113
|
+
assert_equal args[7], @geo.smaller
|
114
|
+
end
|
115
|
+
|
116
|
+
should "have an aspect ratio of #{args[8]}" do
|
117
|
+
assert_in_delta args[8], @geo.aspect, 0.0001
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
[[ [1000, 100], [64, 64], "x64", "64x64+288+0" ],
|
123
|
+
[ [100, 1000], [50, 950], "x950", "50x950+22+0" ],
|
124
|
+
[ [100, 1000], [50, 25], "50x", "50x25+0+237" ]]. each do |args|
|
125
|
+
context "of #{args[0].inspect} and given a Geometry #{args[1].inspect} and sent transform_to" do
|
126
|
+
setup do
|
127
|
+
@geo = Paperclip::Geometry.new(*args[0])
|
128
|
+
@dst = Paperclip::Geometry.new(*args[1])
|
129
|
+
@scale, @crop = @geo.transformation_to @dst, true
|
130
|
+
end
|
131
|
+
|
132
|
+
should "be able to return the correct scaling transformation geometry #{args[2]}" do
|
133
|
+
assert_equal args[2], @scale
|
134
|
+
end
|
135
|
+
|
136
|
+
should "be able to return the correct crop transformation geometry #{args[3]}" do
|
137
|
+
assert_equal args[3], @crop
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'shoulda'
|
4
|
+
require 'mocha'
|
5
|
+
require 'tempfile'
|
6
|
+
|
7
|
+
require 'extlib'
|
8
|
+
require 'dm-core'
|
9
|
+
require 'dm-validations'
|
10
|
+
require 'dm-migrations'
|
11
|
+
begin
|
12
|
+
require 'ruby-debug'
|
13
|
+
rescue LoadError
|
14
|
+
puts "ruby-debug not loaded"
|
15
|
+
end
|
16
|
+
|
17
|
+
ROOT = File.join(File.dirname(__FILE__), '..')
|
18
|
+
RAILS_ROOT = ROOT
|
19
|
+
RAILS_ENV = ENV['RAILS_ENV']
|
20
|
+
|
21
|
+
Object.const_set("Merb", Class.new())
|
22
|
+
Merb.class_eval do
|
23
|
+
def self.root
|
24
|
+
"#{ROOT}"
|
25
|
+
end
|
26
|
+
def self.env(str=nil)
|
27
|
+
ENV['RAILS_ENV'] = str if str
|
28
|
+
ENV['RAILS_ENV']
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
$LOAD_PATH << File.join(ROOT, 'lib')
|
33
|
+
$LOAD_PATH << File.join(ROOT, 'lib', 'dm-paperclip')
|
34
|
+
|
35
|
+
require File.join(ROOT, 'lib', 'dm-paperclip.rb')
|
36
|
+
|
37
|
+
ENV['RAILS_ENV'] ||= 'test'
|
38
|
+
|
39
|
+
FIXTURES_DIR = File.join(File.dirname(__FILE__), "fixtures")
|
40
|
+
DataMapper.setup(:default, 'sqlite3::memory:')
|
41
|
+
|
42
|
+
unless defined?(Mash)
|
43
|
+
class Mash < Hash
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
Paperclip.configure do |config|
|
48
|
+
config.root = Merb.root # the application root to anchor relative urls (defaults to Dir.pwd)
|
49
|
+
config.env = Merb.env # server env support, defaults to ENV['RACK_ENV'] or 'development'
|
50
|
+
config.use_dm_validations = true # validate attachment sizes and such, defaults to false
|
51
|
+
end
|
52
|
+
|
53
|
+
def rebuild_model options = {}
|
54
|
+
Object.send(:remove_const, "Dummy") rescue nil
|
55
|
+
Object.const_set("Dummy", Class.new())
|
56
|
+
Dummy.class_eval do
|
57
|
+
include DataMapper::Resource
|
58
|
+
include DataMapper::Validate
|
59
|
+
include Paperclip::Resource
|
60
|
+
property :id, ::DataMapper::Types::Serial
|
61
|
+
property :other, String
|
62
|
+
has_attached_file :avatar, options
|
63
|
+
end
|
64
|
+
Dummy.auto_migrate!
|
65
|
+
end
|
66
|
+
|
67
|
+
def temporary_env(new_env)
|
68
|
+
old_env = Merb.env
|
69
|
+
Merb.env(new_env)
|
70
|
+
yield
|
71
|
+
Merb.env(old_env)
|
72
|
+
end
|