paperclip 5.1.0 → 5.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +17 -0
- data/.hound.yml +5 -16
- data/.travis.yml +14 -15
- data/Appraisals +3 -23
- data/Gemfile +1 -0
- data/NEWS +36 -1
- data/README.md +58 -10
- data/Rakefile +1 -1
- data/UPGRADING +1 -1
- data/features/step_definitions/attachment_steps.rb +6 -6
- data/features/step_definitions/rails_steps.rb +29 -22
- data/features/step_definitions/s3_steps.rb +1 -1
- data/features/support/env.rb +1 -0
- data/features/support/paths.rb +1 -1
- data/features/support/rails.rb +0 -24
- data/gemfiles/{4.2.awsv2.0.gemfile → 4.2.gemfile} +1 -1
- data/gemfiles/{5.0.awsv2.1.gemfile → 5.0.gemfile} +2 -2
- data/lib/paperclip.rb +12 -10
- data/lib/paperclip/attachment.rb +10 -4
- data/lib/paperclip/io_adapters/abstract_adapter.rb +24 -2
- data/lib/paperclip/io_adapters/attachment_adapter.rb +10 -5
- data/lib/paperclip/io_adapters/data_uri_adapter.rb +8 -8
- data/lib/paperclip/io_adapters/empty_string_adapter.rb +5 -4
- data/lib/paperclip/io_adapters/file_adapter.rb +12 -6
- data/lib/paperclip/io_adapters/http_url_proxy_adapter.rb +7 -7
- data/lib/paperclip/io_adapters/identity_adapter.rb +12 -6
- data/lib/paperclip/io_adapters/nil_adapter.rb +8 -5
- data/lib/paperclip/io_adapters/registry.rb +6 -2
- data/lib/paperclip/io_adapters/stringio_adapter.rb +9 -6
- data/lib/paperclip/io_adapters/uploaded_file_adapter.rb +9 -5
- data/lib/paperclip/io_adapters/uri_adapter.rb +13 -11
- data/lib/paperclip/storage/filesystem.rb +13 -2
- data/lib/paperclip/storage/fog.rb +7 -4
- data/lib/paperclip/storage/s3.rb +31 -3
- data/lib/paperclip/thumbnail.rb +14 -4
- data/lib/paperclip/version.rb +1 -1
- data/lib/tasks/paperclip.rake +17 -3
- data/paperclip.gemspec +3 -3
- data/spec/paperclip/attachment_spec.rb +39 -8
- data/spec/paperclip/io_adapters/abstract_adapter_spec.rb +44 -21
- data/spec/paperclip/io_adapters/attachment_adapter_spec.rb +6 -3
- data/spec/paperclip/io_adapters/data_uri_adapter_spec.rb +7 -1
- data/spec/paperclip/io_adapters/file_adapter_spec.rb +2 -2
- data/spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb +6 -1
- data/spec/paperclip/io_adapters/identity_adapter_spec.rb +1 -1
- data/spec/paperclip/io_adapters/registry_spec.rb +2 -2
- data/spec/paperclip/io_adapters/stringio_adapter_spec.rb +1 -1
- data/spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb +3 -3
- data/spec/paperclip/io_adapters/uri_adapter_spec.rb +6 -1
- data/spec/paperclip/storage/fog_spec.rb +16 -0
- data/spec/paperclip/storage/s3_live_spec.rb +12 -10
- data/spec/paperclip/storage/s3_spec.rb +85 -4
- data/spec/paperclip/tempfile_spec.rb +35 -0
- data/spec/paperclip/thumbnail_spec.rb +35 -32
- data/spec/spec_helper.rb +3 -1
- data/spec/support/assertions.rb +5 -1
- data/spec/support/conditional_filter_helper.rb +5 -0
- metadata +31 -135
- data/gemfiles/4.2.awsv2.1.gemfile +0 -17
- data/gemfiles/4.2.awsv2.gemfile +0 -20
- data/gemfiles/5.0.awsv2.0.gemfile +0 -17
- data/gemfiles/5.0.awsv2.gemfile +0 -20
@@ -13,7 +13,8 @@ describe Paperclip::AttachmentAdapter do
|
|
13
13
|
|
14
14
|
@attachment.assign(@file)
|
15
15
|
@attachment.save
|
16
|
-
@subject = Paperclip.io_adapters.for(@attachment
|
16
|
+
@subject = Paperclip.io_adapters.for(@attachment,
|
17
|
+
hash_digest: Digest::MD5)
|
17
18
|
end
|
18
19
|
|
19
20
|
after do
|
@@ -65,7 +66,8 @@ describe Paperclip::AttachmentAdapter do
|
|
65
66
|
|
66
67
|
@attachment.assign(@file)
|
67
68
|
@attachment.save
|
68
|
-
@subject = Paperclip.io_adapters.for(@attachment
|
69
|
+
@subject = Paperclip.io_adapters.for(@attachment,
|
70
|
+
hash_digest: Digest::MD5)
|
69
71
|
end
|
70
72
|
|
71
73
|
after do
|
@@ -92,7 +94,8 @@ describe Paperclip::AttachmentAdapter do
|
|
92
94
|
FileUtils.cp @attachment.queued_for_write[:thumb].path, @thumb.path
|
93
95
|
|
94
96
|
@attachment.save
|
95
|
-
@subject = Paperclip.io_adapters.for(@attachment.styles[:thumb]
|
97
|
+
@subject = Paperclip.io_adapters.for(@attachment.styles[:thumb],
|
98
|
+
hash_digest: Digest::MD5)
|
96
99
|
end
|
97
100
|
|
98
101
|
after do
|
@@ -1,7 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Paperclip::DataUriAdapter do
|
4
|
+
before do
|
5
|
+
Paperclip::DataUriAdapter.register
|
6
|
+
end
|
7
|
+
|
4
8
|
after do
|
9
|
+
Paperclip.io_adapters.unregister(described_class)
|
10
|
+
|
5
11
|
if @subject
|
6
12
|
@subject.close
|
7
13
|
end
|
@@ -20,7 +26,7 @@ describe Paperclip::DataUriAdapter do
|
|
20
26
|
context "a new instance" do
|
21
27
|
before do
|
22
28
|
@contents = "data:image/png;base64,#{original_base64_content}"
|
23
|
-
@subject = Paperclip.io_adapters.for(@contents)
|
29
|
+
@subject = Paperclip.io_adapters.for(@contents, hash_digest: Digest::MD5)
|
24
30
|
end
|
25
31
|
|
26
32
|
it "returns a nondescript file name" do
|
@@ -15,7 +15,7 @@ describe Paperclip::FileAdapter do
|
|
15
15
|
|
16
16
|
context 'doing normal things' do
|
17
17
|
before do
|
18
|
-
@subject = Paperclip.io_adapters.for(@file)
|
18
|
+
@subject = Paperclip.io_adapters.for(@file, hash_digest: Digest::MD5)
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'uses the original filename to generate the tempfile' do
|
@@ -61,7 +61,7 @@ describe Paperclip::FileAdapter do
|
|
61
61
|
context "file with multiple possible content type" do
|
62
62
|
before do
|
63
63
|
MIME::Types.stubs(:type_for).returns([MIME::Type.new('image/x-png'), MIME::Type.new('image/png')])
|
64
|
-
@subject = Paperclip.io_adapters.for(@file)
|
64
|
+
@subject = Paperclip.io_adapters.for(@file, hash_digest: Digest::MD5)
|
65
65
|
end
|
66
66
|
|
67
67
|
it "prefers officially registered mime type" do
|
@@ -7,12 +7,17 @@ describe Paperclip::HttpUrlProxyAdapter do
|
|
7
7
|
@open_return.stubs(:meta).returns({})
|
8
8
|
Paperclip::HttpUrlProxyAdapter.any_instance.
|
9
9
|
stubs(:download_content).returns(@open_return)
|
10
|
+
Paperclip::HttpUrlProxyAdapter.register
|
11
|
+
end
|
12
|
+
|
13
|
+
after do
|
14
|
+
Paperclip.io_adapters.unregister(described_class)
|
10
15
|
end
|
11
16
|
|
12
17
|
context "a new instance" do
|
13
18
|
before do
|
14
19
|
@url = "http://thoughtbot.com/images/thoughtbot-logo.png"
|
15
|
-
@subject = Paperclip.io_adapters.for(@url)
|
20
|
+
@subject = Paperclip.io_adapters.for(@url, hash_digest: Digest::MD5)
|
16
21
|
end
|
17
22
|
|
18
23
|
after do
|
@@ -4,7 +4,7 @@ describe Paperclip::AttachmentRegistry do
|
|
4
4
|
context "for" do
|
5
5
|
before do
|
6
6
|
class AdapterTest
|
7
|
-
def initialize(
|
7
|
+
def initialize(_target, _ = {}); end
|
8
8
|
end
|
9
9
|
@subject = Paperclip::AdapterRegistry.new
|
10
10
|
@subject.register(AdapterTest){|t| Symbol === t }
|
@@ -18,7 +18,7 @@ describe Paperclip::AttachmentRegistry do
|
|
18
18
|
context "registered?" do
|
19
19
|
before do
|
20
20
|
class AdapterTest
|
21
|
-
def initialize(
|
21
|
+
def initialize(_target, _ = {}); end
|
22
22
|
end
|
23
23
|
@subject = Paperclip::AdapterRegistry.new
|
24
24
|
@subject.register(AdapterTest){|t| Symbol === t }
|
@@ -5,7 +5,7 @@ describe Paperclip::StringioAdapter do
|
|
5
5
|
before do
|
6
6
|
@contents = "abc123"
|
7
7
|
@stringio = StringIO.new(@contents)
|
8
|
-
@subject = Paperclip.io_adapters.for(@stringio)
|
8
|
+
@subject = Paperclip.io_adapters.for(@stringio, hash_digest: Digest::MD5)
|
9
9
|
end
|
10
10
|
|
11
11
|
it "returns a file name" do
|
@@ -17,7 +17,7 @@ describe Paperclip::UploadedFileAdapter do
|
|
17
17
|
tempfile: tempfile,
|
18
18
|
path: tempfile.path
|
19
19
|
)
|
20
|
-
@subject = Paperclip.io_adapters.for(@file)
|
20
|
+
@subject = Paperclip.io_adapters.for(@file, hash_digest: Digest::MD5)
|
21
21
|
end
|
22
22
|
|
23
23
|
it "gets the right filename" do
|
@@ -63,7 +63,7 @@ describe Paperclip::UploadedFileAdapter do
|
|
63
63
|
head: "",
|
64
64
|
path: fixture_file("5k.png")
|
65
65
|
)
|
66
|
-
@subject = Paperclip.io_adapters.for(@file)
|
66
|
+
@subject = Paperclip.io_adapters.for(@file, hash_digest: Digest::MD5)
|
67
67
|
end
|
68
68
|
|
69
69
|
it "does not generate paths that include restricted characters" do
|
@@ -86,7 +86,7 @@ describe Paperclip::UploadedFileAdapter do
|
|
86
86
|
head: "",
|
87
87
|
path: fixture_file("5k.png")
|
88
88
|
)
|
89
|
-
@subject = Paperclip.io_adapters.for(@file)
|
89
|
+
@subject = Paperclip.io_adapters.for(@file, hash_digest: Digest::MD5)
|
90
90
|
end
|
91
91
|
|
92
92
|
it "gets the right filename" do
|
@@ -8,6 +8,11 @@ describe Paperclip::UriAdapter do
|
|
8
8
|
@open_return = StringIO.new("xxx")
|
9
9
|
@open_return.stubs(:content_type).returns(content_type)
|
10
10
|
@open_return.stubs(:meta).returns(meta)
|
11
|
+
Paperclip::UriAdapter.register
|
12
|
+
end
|
13
|
+
|
14
|
+
after do
|
15
|
+
Paperclip.io_adapters.unregister(described_class)
|
11
16
|
end
|
12
17
|
|
13
18
|
context "a new instance" do
|
@@ -16,7 +21,7 @@ describe Paperclip::UriAdapter do
|
|
16
21
|
stubs(:download_content).returns(@open_return)
|
17
22
|
|
18
23
|
@uri = URI.parse("http://thoughtbot.com/images/thoughtbot-logo.png")
|
19
|
-
@subject = Paperclip.io_adapters.for(@uri)
|
24
|
+
@subject = Paperclip.io_adapters.for(@uri, hash_digest: Digest::MD5)
|
20
25
|
end
|
21
26
|
|
22
27
|
it "returns a file name" do
|
@@ -273,6 +273,22 @@ describe Paperclip::Storage::Fog do
|
|
273
273
|
end
|
274
274
|
end
|
275
275
|
|
276
|
+
context "with fog_public as a proc" do
|
277
|
+
let(:proc) { ->(attachment) { !attachment } }
|
278
|
+
|
279
|
+
before do
|
280
|
+
rebuild_model(@options.merge(fog_public: proc))
|
281
|
+
@dummy = Dummy.new
|
282
|
+
@dummy.avatar = StringIO.new(".")
|
283
|
+
@dummy.save
|
284
|
+
end
|
285
|
+
|
286
|
+
it "sets the @fog_public instance variable to false" do
|
287
|
+
assert_equal proc, @dummy.avatar.instance_variable_get("@options")[:fog_public]
|
288
|
+
assert_equal false, @dummy.avatar.fog_public
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
276
292
|
context "with styles set and fog_public set to false" do
|
277
293
|
before do
|
278
294
|
rebuild_model(@options.merge(fog_public: false, styles: { medium: "300x300>", thumb: "100x100>" }))
|
@@ -10,8 +10,8 @@ unless ENV["S3_BUCKET"].blank?
|
|
10
10
|
path: ":class/:attachment/:id/:style.:extension",
|
11
11
|
s3_region: ENV["S3_REGION"],
|
12
12
|
s3_credentials: {
|
13
|
-
|
14
|
-
|
13
|
+
access_key_id: ENV['AWS_ACCESS_KEY_ID'],
|
14
|
+
secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
|
15
15
|
}
|
16
16
|
|
17
17
|
@file = File.new(fixture_file("5k.png"))
|
@@ -48,8 +48,8 @@ unless ENV["S3_BUCKET"].blank?
|
|
48
48
|
path: ":class/:attachment/:id/:style.:extension",
|
49
49
|
s3_region: ENV["S3_REGION"],
|
50
50
|
s3_credentials: {
|
51
|
-
|
52
|
-
|
51
|
+
access_key_id: ENV['AWS_ACCESS_KEY_ID'],
|
52
|
+
secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
|
53
53
|
}
|
54
54
|
|
55
55
|
@dummy = Dummy.new
|
@@ -68,8 +68,8 @@ unless ENV["S3_BUCKET"].blank?
|
|
68
68
|
path: ":class/:attachment/:id/:style.:extension",
|
69
69
|
s3_region: ENV["S3_REGION"],
|
70
70
|
s3_credentials: {
|
71
|
-
|
72
|
-
|
71
|
+
access_key_id: ENV['AWS_ACCESS_KEY_ID'],
|
72
|
+
secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
|
73
73
|
}
|
74
74
|
|
75
75
|
Dummy.delete_all
|
@@ -109,9 +109,11 @@ unless ENV["S3_BUCKET"].blank?
|
|
109
109
|
storage: :s3,
|
110
110
|
bucket: ENV["S3_BUCKET"],
|
111
111
|
s3_region: ENV["S3_REGION"],
|
112
|
+
url: ":s3_domain_url",
|
113
|
+
path: "/:class/:attachment/:id_partition/:style/:filename",
|
112
114
|
s3_credentials: {
|
113
|
-
|
114
|
-
|
115
|
+
access_key_id: ENV['AWS_ACCESS_KEY_ID'],
|
116
|
+
secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
|
115
117
|
}
|
116
118
|
|
117
119
|
Dummy.delete_all
|
@@ -152,8 +154,8 @@ unless ENV["S3_BUCKET"].blank?
|
|
152
154
|
path: ":class/:attachment/:id/:style.:extension",
|
153
155
|
s3_region: ENV["S3_REGION"],
|
154
156
|
s3_credentials: {
|
155
|
-
|
156
|
-
|
157
|
+
access_key_id: ENV['AWS_ACCESS_KEY_ID'],
|
158
|
+
secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
|
157
159
|
},
|
158
160
|
s3_server_side_encryption: "AES256"
|
159
161
|
Dummy.delete_all
|
@@ -256,7 +256,7 @@ describe Paperclip::Storage::S3 do
|
|
256
256
|
end
|
257
257
|
|
258
258
|
it "uses the S3 bucket with the correct host name" do
|
259
|
-
assert_equal "s3
|
259
|
+
assert_equal "s3.ap-northeast-1.amazonaws.com",
|
260
260
|
@dummy.avatar.s3_bucket.client.config.endpoint.host
|
261
261
|
end
|
262
262
|
end
|
@@ -282,6 +282,59 @@ describe Paperclip::Storage::S3 do
|
|
282
282
|
end
|
283
283
|
end
|
284
284
|
|
285
|
+
context "use_accelerate_endpoint", if: aws_accelerate_available? do
|
286
|
+
context "defaults to false" do
|
287
|
+
before do
|
288
|
+
rebuild_model(
|
289
|
+
storage: :s3,
|
290
|
+
s3_credentials: {},
|
291
|
+
bucket: "bucket",
|
292
|
+
path: ":attachment/:basename:dotextension",
|
293
|
+
s3_host_name: "s3-ap-northeast-1.amazonaws.com",
|
294
|
+
s3_region: "ap-northeast-1",
|
295
|
+
)
|
296
|
+
@dummy = Dummy.new
|
297
|
+
@dummy.avatar = stringy_file
|
298
|
+
@dummy.stubs(:new_record?).returns(false)
|
299
|
+
end
|
300
|
+
|
301
|
+
it "returns a url based on an :s3_host_name path" do
|
302
|
+
assert_match %r{^//s3-ap-northeast-1.amazonaws.com/bucket/avatars/data[^\.]},
|
303
|
+
@dummy.avatar.url
|
304
|
+
end
|
305
|
+
|
306
|
+
it "uses the S3 client with the use_accelerate_endpoint config is false" do
|
307
|
+
expect(@dummy.avatar.s3_bucket.client.config.use_accelerate_endpoint).to be(false)
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
context "set to true", if: aws_accelerate_available? do
|
312
|
+
before do
|
313
|
+
rebuild_model(
|
314
|
+
storage: :s3,
|
315
|
+
s3_credentials: {},
|
316
|
+
bucket: "bucket",
|
317
|
+
path: ":attachment/:basename:dotextension",
|
318
|
+
s3_host_name: "s3-accelerate.amazonaws.com",
|
319
|
+
s3_region: "ap-northeast-1",
|
320
|
+
use_accelerate_endpoint: true,
|
321
|
+
)
|
322
|
+
@dummy = Dummy.new
|
323
|
+
@dummy.avatar = stringy_file
|
324
|
+
@dummy.stubs(:new_record?).returns(false)
|
325
|
+
end
|
326
|
+
|
327
|
+
it "returns a url based on an :s3_host_name path" do
|
328
|
+
assert_match %r{^//s3-accelerate.amazonaws.com/bucket/avatars/data[^\.]},
|
329
|
+
@dummy.avatar.url
|
330
|
+
end
|
331
|
+
|
332
|
+
it "uses the S3 client with the use_accelerate_endpoint config is true" do
|
333
|
+
expect(@dummy.avatar.s3_bucket.client.config.use_accelerate_endpoint).to be(true)
|
334
|
+
end
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
285
338
|
context "An attachment that uses S3 for storage and has styles that return different file types" do
|
286
339
|
before do
|
287
340
|
rebuild_model (aws2_add_region).merge storage: :s3,
|
@@ -458,7 +511,7 @@ describe Paperclip::Storage::S3 do
|
|
458
511
|
"question?mark.png"
|
459
512
|
end
|
460
513
|
end
|
461
|
-
file = Paperclip.io_adapters.for(stringio)
|
514
|
+
file = Paperclip.io_adapters.for(stringio, hash_digest: Digest::MD5)
|
462
515
|
@dummy = Dummy.new
|
463
516
|
@dummy.avatar = file
|
464
517
|
@dummy.save
|
@@ -514,6 +567,33 @@ describe Paperclip::Storage::S3 do
|
|
514
567
|
end
|
515
568
|
end
|
516
569
|
|
570
|
+
context "generating a url with a prefixed host alias" do
|
571
|
+
before do
|
572
|
+
rebuild_model(
|
573
|
+
aws2_add_region.merge(
|
574
|
+
storage: :s3,
|
575
|
+
s3_credentials: {
|
576
|
+
production: { bucket: "prod_bucket" },
|
577
|
+
development: { bucket: "dev_bucket" },
|
578
|
+
},
|
579
|
+
bucket: "bucket",
|
580
|
+
s3_host_alias: "something.something.com",
|
581
|
+
s3_prefixes_in_alias: 2,
|
582
|
+
path: "prefix1/prefix2/:attachment/:basename:dotextension",
|
583
|
+
url: ":s3_alias_url",
|
584
|
+
)
|
585
|
+
)
|
586
|
+
@dummy = Dummy.new
|
587
|
+
@dummy.avatar = stringy_file
|
588
|
+
@dummy.stubs(:new_record?).returns(false)
|
589
|
+
end
|
590
|
+
|
591
|
+
it "returns a url with the prefixes removed" do
|
592
|
+
assert_match %r{^//something.something.com/avatars/data[^\.]},
|
593
|
+
@dummy.avatar.url
|
594
|
+
end
|
595
|
+
end
|
596
|
+
|
517
597
|
context "generating a url with a proc as the host alias" do
|
518
598
|
before do
|
519
599
|
rebuild_model (aws2_add_region).merge storage: :s3,
|
@@ -741,8 +821,9 @@ describe Paperclip::Storage::S3 do
|
|
741
821
|
|
742
822
|
it "gets the right s3_host_name in development" do
|
743
823
|
rails_env("development") do
|
744
|
-
assert_match %r{^s3
|
745
|
-
|
824
|
+
assert_match %r{^s3.ap-northeast-1.amazonaws.com},
|
825
|
+
@dummy.avatar.s3_host_name
|
826
|
+
assert_match %r{^s3.ap-northeast-1.amazonaws.com},
|
746
827
|
@dummy.avatar.s3_bucket.client.config.endpoint.host
|
747
828
|
end
|
748
829
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Paperclip::Tempfile do
|
4
|
+
context "A Paperclip Tempfile" do
|
5
|
+
before do
|
6
|
+
@tempfile = described_class.new(["file", ".jpg"])
|
7
|
+
end
|
8
|
+
|
9
|
+
after { @tempfile.close }
|
10
|
+
|
11
|
+
it "has its path contain a real extension" do
|
12
|
+
assert_equal ".jpg", File.extname(@tempfile.path)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "is a real Tempfile" do
|
16
|
+
assert @tempfile.is_a?(::Tempfile)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "Another Paperclip Tempfile" do
|
21
|
+
before do
|
22
|
+
@tempfile = described_class.new("file")
|
23
|
+
end
|
24
|
+
|
25
|
+
after { @tempfile.close }
|
26
|
+
|
27
|
+
it "does not have an extension if not given one" do
|
28
|
+
assert_equal "", File.extname(@tempfile.path)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "is a real Tempfile" do
|
32
|
+
assert @tempfile.is_a?(::Tempfile)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -1,38 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Paperclip::Thumbnail do
|
4
|
-
context "A Paperclip Tempfile" do
|
5
|
-
before do
|
6
|
-
@tempfile = Paperclip::Tempfile.new(["file", ".jpg"])
|
7
|
-
end
|
8
|
-
|
9
|
-
after { @tempfile.close }
|
10
|
-
|
11
|
-
it "has its path contain a real extension" do
|
12
|
-
assert_equal ".jpg", File.extname(@tempfile.path)
|
13
|
-
end
|
14
|
-
|
15
|
-
it "is a real Tempfile" do
|
16
|
-
assert @tempfile.is_a?(::Tempfile)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
context "Another Paperclip Tempfile" do
|
21
|
-
before do
|
22
|
-
@tempfile = Paperclip::Tempfile.new("file")
|
23
|
-
end
|
24
|
-
|
25
|
-
after { @tempfile.close }
|
26
|
-
|
27
|
-
it "does not have an extension if not given one" do
|
28
|
-
assert_equal "", File.extname(@tempfile.path)
|
29
|
-
end
|
30
|
-
|
31
|
-
it "is a real Tempfile" do
|
32
|
-
assert @tempfile.is_a?(::Tempfile)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
4
|
context "An image" do
|
37
5
|
before do
|
38
6
|
@file = File.new(fixture_file("5k.png"), 'rb')
|
@@ -480,6 +448,41 @@ describe Paperclip::Thumbnail do
|
|
480
448
|
assert_equal "50x50", `#{cmd}`.chomp
|
481
449
|
end
|
482
450
|
end
|
451
|
+
|
452
|
+
context "with a specified frame_index" do
|
453
|
+
before do
|
454
|
+
@thumb = Paperclip::Thumbnail.new(
|
455
|
+
@file,
|
456
|
+
geometry: "50x50",
|
457
|
+
frame_index: 5,
|
458
|
+
format: :jpg,
|
459
|
+
)
|
460
|
+
end
|
461
|
+
|
462
|
+
it "creates the thumbnail from the frame index when sent #make" do
|
463
|
+
@thumb.make
|
464
|
+
assert_equal 5, @thumb.frame_index
|
465
|
+
end
|
466
|
+
end
|
467
|
+
|
468
|
+
context "with a specified frame_index out of bounds" do
|
469
|
+
before do
|
470
|
+
@thumb = Paperclip::Thumbnail.new(
|
471
|
+
@file,
|
472
|
+
geometry: "50x50",
|
473
|
+
frame_index: 20,
|
474
|
+
format: :jpg,
|
475
|
+
)
|
476
|
+
end
|
477
|
+
|
478
|
+
it "errors when trying to create the thumbnail" do
|
479
|
+
assert_raises(Paperclip::Error) do
|
480
|
+
silence_stream(STDERR) do
|
481
|
+
@thumb.make
|
482
|
+
end
|
483
|
+
end
|
484
|
+
end
|
485
|
+
end
|
483
486
|
end
|
484
487
|
|
485
488
|
context "with a really long file name" do
|