paperclip 4.1.1 → 4.2.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of paperclip might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.gitignore +0 -6
- data/.travis.yml +4 -13
- data/Appraisals +0 -10
- data/CONTRIBUTING.md +10 -5
- data/Gemfile +8 -4
- data/NEWS +1 -1
- data/README.md +51 -10
- data/Rakefile +6 -8
- data/features/basic_integration.feature +5 -5
- data/features/step_definitions/attachment_steps.rb +4 -4
- data/features/step_definitions/rails_steps.rb +4 -4
- data/features/step_definitions/web_steps.rb +2 -2
- data/features/support/env.rb +2 -2
- data/features/support/fixtures/gemfile.txt +1 -1
- data/features/support/rails.rb +2 -1
- data/gemfiles/3.2.gemfile +5 -3
- data/gemfiles/4.0.gemfile +5 -3
- data/gemfiles/4.1.gemfile +5 -3
- data/lib/generators/paperclip/paperclip_generator.rb +0 -2
- data/lib/generators/paperclip/templates/paperclip_migration.rb.erb +1 -1
- data/lib/paperclip.rb +4 -1
- data/lib/paperclip/attachment.rb +90 -29
- data/lib/paperclip/content_type_detector.rb +1 -1
- data/lib/paperclip/geometry_detector_factory.rb +3 -1
- data/lib/paperclip/has_attached_file.rb +2 -1
- data/lib/paperclip/interpolations.rb +8 -0
- data/lib/paperclip/io_adapters/abstract_adapter.rb +1 -1
- data/lib/paperclip/io_adapters/data_uri_adapter.rb +1 -1
- data/lib/paperclip/io_adapters/stringio_adapter.rb +5 -11
- data/lib/paperclip/locales/de.yml +18 -0
- data/lib/paperclip/locales/es.yml +18 -0
- data/lib/paperclip/matchers/have_attached_file_matcher.rb +2 -1
- data/lib/paperclip/matchers/validate_attachment_presence_matcher.rb +2 -1
- data/lib/paperclip/matchers/validate_attachment_size_matcher.rb +2 -1
- data/lib/paperclip/media_type_spoof_detector.rb +10 -2
- data/lib/paperclip/storage/filesystem.rb +1 -1
- data/lib/paperclip/storage/s3.rb +26 -4
- data/lib/paperclip/style.rb +1 -1
- data/lib/paperclip/thumbnail.rb +6 -6
- data/lib/paperclip/validators.rb +5 -3
- data/lib/paperclip/validators/attachment_size_validator.rb +7 -3
- data/lib/paperclip/version.rb +1 -1
- data/lib/tasks/paperclip.rake +1 -2
- data/paperclip.gemspec +5 -3
- data/shoulda_macros/paperclip.rb +0 -1
- data/{test → spec}/database.yml +0 -0
- data/spec/paperclip/attachment_definitions_spec.rb +13 -0
- data/{test/attachment_processing_test.rb → spec/paperclip/attachment_processing_spec.rb} +20 -21
- data/{test/attachment_registry_test.rb → spec/paperclip/attachment_registry_spec.rb} +10 -11
- data/{test/attachment_test.rb → spec/paperclip/attachment_spec.rb} +367 -360
- data/{test/content_type_detector_test.rb → spec/paperclip/content_type_detector_spec.rb} +8 -8
- data/{test/file_command_content_type_detector_test.rb → spec/paperclip/file_command_content_type_detector_spec.rb} +5 -5
- data/spec/paperclip/filename_cleaner_spec.rb +14 -0
- data/spec/paperclip/geometry_detector_spec.rb +39 -0
- data/{test/geometry_parser_test.rb → spec/paperclip/geometry_parser_spec.rb} +27 -27
- data/{test/geometry_test.rb → spec/paperclip/geometry_spec.rb} +49 -51
- data/{test/has_attached_file_test.rb → spec/paperclip/has_attached_file_spec.rb} +18 -27
- data/{test/integration_test.rb → spec/paperclip/integration_spec.rb} +134 -126
- data/{test/interpolations_test.rb → spec/paperclip/interpolations_spec.rb} +54 -40
- data/{test/io_adapters/abstract_adapter_test.rb → spec/paperclip/io_adapters/abstract_adapter_spec.rb} +21 -10
- data/{test/io_adapters/attachment_adapter_test.rb → spec/paperclip/io_adapters/attachment_adapter_spec.rb} +27 -29
- data/{test/io_adapters/data_uri_adapter_test.rb → spec/paperclip/io_adapters/data_uri_adapter_spec.rb} +22 -18
- data/spec/paperclip/io_adapters/empty_string_adapter_spec.rb +17 -0
- data/{test/io_adapters/file_adapter_test.rb → spec/paperclip/io_adapters/file_adapter_spec.rb} +32 -28
- data/{test/io_adapters/http_url_proxy_adapter_test.rb → spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb} +22 -22
- data/spec/paperclip/io_adapters/identity_adapter_spec.rb +8 -0
- data/{test/io_adapters/nil_adapter_test.rb → spec/paperclip/io_adapters/nil_adapter_spec.rb} +7 -7
- data/{test/io_adapters/registry_test.rb → spec/paperclip/io_adapters/registry_spec.rb} +10 -7
- data/{test/io_adapters/stringio_adapter_test.rb → spec/paperclip/io_adapters/stringio_adapter_spec.rb} +16 -17
- data/{test/io_adapters/uploaded_file_adapter_test.rb → spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb} +41 -41
- data/{test/io_adapters/uri_adapter_test.rb → spec/paperclip/io_adapters/uri_adapter_spec.rb} +22 -22
- data/spec/paperclip/matchers/have_attached_file_matcher_spec.rb +19 -0
- data/spec/paperclip/matchers/validate_attachment_content_type_matcher_spec.rb +99 -0
- data/spec/paperclip/matchers/validate_attachment_presence_matcher_spec.rb +69 -0
- data/spec/paperclip/matchers/validate_attachment_size_matcher_spec.rb +88 -0
- data/{test/media_type_spoof_detector_test.rb → spec/paperclip/media_type_spoof_detector_spec.rb} +13 -8
- data/spec/paperclip/meta_class_spec.rb +30 -0
- data/spec/paperclip/paperclip_missing_attachment_styles_spec.rb +84 -0
- data/{test/paperclip_test.rb → spec/paperclip/paperclip_spec.rb} +47 -47
- data/{test/plural_cache_test.rb → spec/paperclip/plural_cache_spec.rb} +6 -6
- data/{test/processor_test.rb → spec/paperclip/processor_spec.rb} +5 -5
- data/{test/rake_test.rb → spec/paperclip/rake_spec.rb} +15 -15
- data/spec/paperclip/schema_spec.rb +206 -0
- data/{test/storage/filesystem_test.rb → spec/paperclip/storage/filesystem_spec.rb} +18 -18
- data/{test/storage/fog_test.rb → spec/paperclip/storage/fog_spec.rb} +145 -140
- data/spec/paperclip/storage/s3_live_spec.rb +182 -0
- data/spec/paperclip/storage/s3_spec.rb +1475 -0
- data/spec/paperclip/style_spec.rb +255 -0
- data/spec/paperclip/tempfile_factory_spec.rb +29 -0
- data/{test/thumbnail_test.rb → spec/paperclip/thumbnail_spec.rb} +107 -107
- data/{test/url_generator_test.rb → spec/paperclip/url_generator_spec.rb} +55 -56
- data/spec/paperclip/validators/attachment_content_type_validator_spec.rb +322 -0
- data/spec/paperclip/validators/attachment_file_name_validator_spec.rb +160 -0
- data/{test/validators/attachment_presence_validator_test.rb → spec/paperclip/validators/attachment_presence_validator_spec.rb} +19 -19
- data/{test/validators/attachment_size_validator_test.rb → spec/paperclip/validators/attachment_size_validator_spec.rb} +65 -58
- data/{test/validators/media_type_spoof_detection_validator_test.rb → spec/paperclip/validators/media_type_spoof_detection_validator_spec.rb} +8 -8
- data/spec/paperclip/validators_spec.rb +164 -0
- data/spec/spec_helper.rb +40 -0
- data/spec/support/assertions.rb +71 -0
- data/spec/support/fake_model.rb +21 -0
- data/spec/support/fake_rails.rb +12 -0
- data/{test → spec/support}/fixtures/12k.png +0 -0
- data/{test → spec/support}/fixtures/50x50.png +0 -0
- data/{test → spec/support}/fixtures/5k.png +0 -0
- data/{test → spec/support}/fixtures/animated +0 -0
- data/{test → spec/support}/fixtures/animated.gif +0 -0
- data/{test → spec/support}/fixtures/animated.unknown +0 -0
- data/{test → spec/support}/fixtures/bad.png +0 -0
- data/{test → spec/support}/fixtures/empty.html +0 -0
- data/{test → spec/support}/fixtures/fog.yml +0 -0
- data/{test → spec/support}/fixtures/rotated.jpg +0 -0
- data/{test → spec/support}/fixtures/s3.yml +0 -0
- data/spec/support/fixtures/spaced file.jpg +0 -0
- data/test/fixtures/spaced file.png b/data/spec/support/fixtures/spaced → file.png +0 -0
- data/{test → spec/support}/fixtures/text.txt +0 -0
- data/{test → spec/support}/fixtures/twopage.pdf +0 -0
- data/{test → spec/support}/fixtures/uppercase.PNG +0 -0
- data/spec/support/matchers/accept.rb +5 -0
- data/spec/support/matchers/exist.rb +5 -0
- data/{test → spec}/support/mock_attachment.rb +0 -0
- data/{test → spec}/support/mock_interpolator.rb +0 -0
- data/{test → spec}/support/mock_model.rb +0 -0
- data/{test → spec}/support/mock_url_generator_builder.rb +0 -0
- data/spec/support/model_reconstruction.rb +60 -0
- data/spec/support/rails_helpers.rb +7 -0
- data/spec/support/test_data.rb +13 -0
- data/spec/support/version_helper.rb +9 -0
- metadata +256 -210
- data/gemfiles/3.0.gemfile +0 -11
- data/gemfiles/3.1.gemfile +0 -11
- data/test/attachment_definitions_test.rb +0 -13
- data/test/filename_cleaner_test.rb +0 -14
- data/test/generator_test.rb +0 -84
- data/test/geometry_detector_test.rb +0 -24
- data/test/helper.rb +0 -239
- data/test/io_adapters/empty_string_adapter_test.rb +0 -18
- data/test/io_adapters/identity_adapter_test.rb +0 -8
- data/test/matchers/have_attached_file_matcher_test.rb +0 -25
- data/test/matchers/validate_attachment_content_type_matcher_test.rb +0 -111
- data/test/matchers/validate_attachment_presence_matcher_test.rb +0 -70
- data/test/matchers/validate_attachment_size_matcher_test.rb +0 -87
- data/test/meta_class_test.rb +0 -32
- data/test/paperclip_missing_attachment_styles_test.rb +0 -90
- data/test/schema_test.rb +0 -206
- data/test/storage/s3_live_test.rb +0 -179
- data/test/storage/s3_test.rb +0 -1357
- data/test/style_test.rb +0 -251
- data/test/tempfile_factory_test.rb +0 -29
- data/test/validators/attachment_content_type_validator_test.rb +0 -324
- data/test/validators/attachment_file_name_validator_test.rb +0 -162
- data/test/validators_test.rb +0 -101
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'paperclip/matchers'
|
3
|
+
|
4
|
+
describe Paperclip::Shoulda::Matchers::ValidateAttachmentPresenceMatcher do
|
5
|
+
extend Paperclip::Shoulda::Matchers
|
6
|
+
|
7
|
+
before do
|
8
|
+
reset_table("dummies") do |d|
|
9
|
+
d.string :avatar_file_name
|
10
|
+
end
|
11
|
+
reset_class "Dummy"
|
12
|
+
Dummy.has_attached_file :avatar
|
13
|
+
Dummy.do_not_validate_attachment_file_type :avatar
|
14
|
+
end
|
15
|
+
|
16
|
+
it "rejects a class with no validation" do
|
17
|
+
expect(matcher).to_not accept(Dummy)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "accepts a class with a matching validation" do
|
21
|
+
Dummy.validates_attachment_presence :avatar
|
22
|
+
expect(matcher).to accept(Dummy)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "accepts an instance with other attachment validations" do
|
26
|
+
reset_table("dummies") do |d|
|
27
|
+
d.string :avatar_file_name
|
28
|
+
d.string :avatar_content_type
|
29
|
+
end
|
30
|
+
Dummy.class_eval do
|
31
|
+
validates_attachment_presence :avatar
|
32
|
+
validates_attachment_content_type :avatar, content_type: 'image/gif'
|
33
|
+
end
|
34
|
+
dummy = Dummy.new
|
35
|
+
|
36
|
+
dummy.avatar = File.new fixture_file('5k.png')
|
37
|
+
|
38
|
+
expect(matcher).to accept(dummy)
|
39
|
+
end
|
40
|
+
|
41
|
+
context "using an :if to control the validation" do
|
42
|
+
before do
|
43
|
+
Dummy.class_eval do
|
44
|
+
validates_attachment_presence :avatar, if: :go
|
45
|
+
attr_accessor :go
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it "runs the validation if the control is true" do
|
50
|
+
dummy = Dummy.new
|
51
|
+
dummy.avatar = nil
|
52
|
+
dummy.go = true
|
53
|
+
expect(matcher).to accept(dummy)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "does not run the validation if the control is false" do
|
57
|
+
dummy = Dummy.new
|
58
|
+
dummy.avatar = nil
|
59
|
+
dummy.go = false
|
60
|
+
expect(matcher).to_not accept(dummy)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def matcher
|
67
|
+
self.class.validate_attachment_presence(:avatar)
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'paperclip/matchers'
|
3
|
+
|
4
|
+
describe Paperclip::Shoulda::Matchers::ValidateAttachmentSizeMatcher do
|
5
|
+
extend Paperclip::Shoulda::Matchers
|
6
|
+
|
7
|
+
before do
|
8
|
+
reset_table("dummies") do |d|
|
9
|
+
d.string :avatar_file_name
|
10
|
+
d.integer :avatar_file_size
|
11
|
+
end
|
12
|
+
reset_class "Dummy"
|
13
|
+
Dummy.do_not_validate_attachment_file_type :avatar
|
14
|
+
Dummy.has_attached_file :avatar
|
15
|
+
end
|
16
|
+
|
17
|
+
context "Limiting size" do
|
18
|
+
it "rejects a class with no validation" do
|
19
|
+
expect(matcher.in(256..1024)).to_not accept(Dummy)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "rejects a class with a validation that's too high" do
|
23
|
+
Dummy.validates_attachment_size :avatar, in: 256..2048
|
24
|
+
expect(matcher.in(256..1024)).to_not accept(Dummy)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "accepts a class with a validation that's too low" do
|
28
|
+
Dummy.validates_attachment_size :avatar, in: 0..1024
|
29
|
+
expect(matcher.in(256..1024)).to_not accept(Dummy)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "accepts a class with a validation that matches" do
|
33
|
+
Dummy.validates_attachment_size :avatar, in: 256..1024
|
34
|
+
expect(matcher.in(256..1024)).to accept(Dummy)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "allowing anything" do
|
39
|
+
it "given a class with an upper limit" do
|
40
|
+
Dummy.validates_attachment_size :avatar, less_than: 1
|
41
|
+
expect(matcher).to accept(Dummy)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "given a class with a lower limit" do
|
45
|
+
Dummy.validates_attachment_size :avatar, greater_than: 1
|
46
|
+
expect(matcher).to accept(Dummy)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "using an :if to control the validation" do
|
51
|
+
before do
|
52
|
+
Dummy.class_eval do
|
53
|
+
validates_attachment_size :avatar, greater_than: 1024, if: :go
|
54
|
+
attr_accessor :go
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
it "run the validation if the control is true" do
|
59
|
+
dummy = Dummy.new
|
60
|
+
dummy.go = true
|
61
|
+
expect(matcher.greater_than(1024)).to accept(dummy)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "not run the validation if the control is false" do
|
65
|
+
dummy = Dummy.new
|
66
|
+
dummy.go = false
|
67
|
+
expect(matcher.greater_than(1024)).to_not accept(dummy)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "post processing" do
|
72
|
+
before do
|
73
|
+
Dummy.validates_attachment_size :avatar, greater_than: 1024
|
74
|
+
end
|
75
|
+
|
76
|
+
it "be skipped" do
|
77
|
+
dummy = Dummy.new
|
78
|
+
dummy.avatar.expects(:post_process).never
|
79
|
+
expect(matcher.greater_than(1024)).to accept(dummy)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def matcher
|
86
|
+
self.class.validate_attachment_size(:avatar)
|
87
|
+
end
|
88
|
+
end
|
data/{test/media_type_spoof_detector_test.rb → spec/paperclip/media_type_spoof_detector_spec.rb}
RENAMED
@@ -1,32 +1,37 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
describe Paperclip::MediaTypeSpoofDetector do
|
4
|
+
it 'rejects a file that is named .html and identifies as PNG' do
|
5
5
|
file = File.open(fixture_file("5k.png"))
|
6
6
|
assert Paperclip::MediaTypeSpoofDetector.using(file, "5k.html").spoofed?
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
it 'does not reject a file that is named .jpg and identifies as PNG' do
|
10
10
|
file = File.open(fixture_file("5k.png"))
|
11
11
|
assert ! Paperclip::MediaTypeSpoofDetector.using(file, "5k.jpg").spoofed?
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
it 'does not reject a file that is named .html and identifies as HTML' do
|
15
15
|
file = File.open(fixture_file("empty.html"))
|
16
16
|
assert ! Paperclip::MediaTypeSpoofDetector.using(file, "empty.html").spoofed?
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
it 'does not reject a file that does not have a name' do
|
20
20
|
file = File.open(fixture_file("empty.html"))
|
21
21
|
assert ! Paperclip::MediaTypeSpoofDetector.using(file, "").spoofed?
|
22
22
|
end
|
23
23
|
|
24
|
-
|
24
|
+
it 'does not reject a file that does have an extension' do
|
25
|
+
file = File.open(fixture_file("empty.html"))
|
26
|
+
assert ! Paperclip::MediaTypeSpoofDetector.using(file, "data").spoofed?
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'does not reject when the supplied file is an IOAdapter' do
|
25
30
|
adapter = Paperclip.io_adapters.for(File.new(fixture_file("5k.png")))
|
26
31
|
assert ! Paperclip::MediaTypeSpoofDetector.using(adapter, adapter.original_filename).spoofed?
|
27
32
|
end
|
28
33
|
|
29
|
-
|
34
|
+
it 'does not reject when the extension => content_type is in :content_type_mappings' do
|
30
35
|
begin
|
31
36
|
Paperclip.options[:content_type_mappings] = { pem: "text/plain" }
|
32
37
|
file = Tempfile.open(["test", ".PEM"])
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Metaclasses' do
|
4
|
+
context "A meta-class of dummy" do
|
5
|
+
if active_support_version >= "4.1" || ruby_version < "2.1"
|
6
|
+
before do
|
7
|
+
rebuild_model("Dummy")
|
8
|
+
reset_class("Dummy")
|
9
|
+
end
|
10
|
+
|
11
|
+
it "is able to use Paperclip like a normal class" do
|
12
|
+
@dummy = Dummy.new
|
13
|
+
|
14
|
+
assert_nothing_raised do
|
15
|
+
rebuild_meta_class_of(@dummy)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "works like any other instance" do
|
20
|
+
@dummy = Dummy.new
|
21
|
+
rebuild_meta_class_of(@dummy)
|
22
|
+
|
23
|
+
assert_nothing_raised do
|
24
|
+
@dummy.avatar = File.new(fixture_file("5k.png"), 'rb')
|
25
|
+
end
|
26
|
+
assert @dummy.save
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Missing Attachment Styles' do
|
4
|
+
before do
|
5
|
+
Paperclip::AttachmentRegistry.clear
|
6
|
+
end
|
7
|
+
|
8
|
+
after do
|
9
|
+
File.unlink(Paperclip.registered_attachments_styles_path) rescue nil
|
10
|
+
end
|
11
|
+
|
12
|
+
it "enables to get and set path to registered styles file" do
|
13
|
+
assert_equal ROOT.join('tmp/public/system/paperclip_attachments.yml').to_s, Paperclip.registered_attachments_styles_path
|
14
|
+
Paperclip.registered_attachments_styles_path = '/tmp/config/paperclip_attachments.yml'
|
15
|
+
assert_equal '/tmp/config/paperclip_attachments.yml', Paperclip.registered_attachments_styles_path
|
16
|
+
Paperclip.registered_attachments_styles_path = nil
|
17
|
+
assert_equal ROOT.join('tmp/public/system/paperclip_attachments.yml').to_s, Paperclip.registered_attachments_styles_path
|
18
|
+
end
|
19
|
+
|
20
|
+
it "is able to get current attachment styles" do
|
21
|
+
assert_equal Hash.new, Paperclip.send(:current_attachments_styles)
|
22
|
+
rebuild_model styles: {croppable: '600x600>', big: '1000x1000>'}
|
23
|
+
expected_hash = { Dummy: {avatar: [:big, :croppable]}}
|
24
|
+
assert_equal expected_hash, Paperclip.send(:current_attachments_styles)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "is able to save current attachment styles for further comparison" do
|
28
|
+
rebuild_model styles: {croppable: '600x600>', big: '1000x1000>'}
|
29
|
+
Paperclip.save_current_attachments_styles!
|
30
|
+
expected_hash = { Dummy: {avatar: [:big, :croppable]}}
|
31
|
+
assert_equal expected_hash, YAML.load_file(Paperclip.registered_attachments_styles_path)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "is able to read registered attachment styles from file" do
|
35
|
+
rebuild_model styles: {croppable: '600x600>', big: '1000x1000>'}
|
36
|
+
Paperclip.save_current_attachments_styles!
|
37
|
+
expected_hash = { Dummy: {avatar: [:big, :croppable]}}
|
38
|
+
assert_equal expected_hash, Paperclip.send(:get_registered_attachments_styles)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "is able to calculate differences between registered styles and current styles" do
|
42
|
+
rebuild_model styles: {croppable: '600x600>', big: '1000x1000>'}
|
43
|
+
Paperclip.save_current_attachments_styles!
|
44
|
+
rebuild_model styles: {thumb: 'x100', export: 'x400>', croppable: '600x600>', big: '1000x1000>'}
|
45
|
+
expected_hash = { Dummy: {avatar: [:export, :thumb]} }
|
46
|
+
assert_equal expected_hash, Paperclip.missing_attachments_styles
|
47
|
+
|
48
|
+
ActiveRecord::Base.connection.create_table :books, force: true
|
49
|
+
class ::Book < ActiveRecord::Base
|
50
|
+
has_attached_file :cover, styles: {small: 'x100', large: '1000x1000>'}
|
51
|
+
has_attached_file :sample, styles: {thumb: 'x100'}
|
52
|
+
end
|
53
|
+
|
54
|
+
expected_hash = {
|
55
|
+
Dummy: {avatar: [:export, :thumb]},
|
56
|
+
Book: {sample: [:thumb], cover: [:large, :small]}
|
57
|
+
}
|
58
|
+
assert_equal expected_hash, Paperclip.missing_attachments_styles
|
59
|
+
Paperclip.save_current_attachments_styles!
|
60
|
+
assert_equal Hash.new, Paperclip.missing_attachments_styles
|
61
|
+
end
|
62
|
+
|
63
|
+
it "is able to calculate differences when a new attachment is added to a model" do
|
64
|
+
rebuild_model styles: {croppable: '600x600>', big: '1000x1000>'}
|
65
|
+
Paperclip.save_current_attachments_styles!
|
66
|
+
|
67
|
+
class ::Dummy
|
68
|
+
has_attached_file :photo, styles: {small: 'x100', large: '1000x1000>'}
|
69
|
+
end
|
70
|
+
|
71
|
+
expected_hash = {
|
72
|
+
Dummy: {photo: [:large, :small]}
|
73
|
+
}
|
74
|
+
assert_equal expected_hash, Paperclip.missing_attachments_styles
|
75
|
+
Paperclip.save_current_attachments_styles!
|
76
|
+
assert_equal Hash.new, Paperclip.missing_attachments_styles
|
77
|
+
end
|
78
|
+
|
79
|
+
# It's impossible to build styles hash without loading from database whole bunch of records
|
80
|
+
it "skips lambda-styles" do
|
81
|
+
rebuild_model styles: lambda{ |attachment| attachment.instance.other == 'a' ? {thumb: "50x50#"} : {large: "400x400"} }
|
82
|
+
assert_equal Hash.new, Paperclip.send(:current_attachments_styles)
|
83
|
+
end
|
84
|
+
end
|
@@ -1,29 +1,29 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
context "
|
5
|
-
|
3
|
+
describe Paperclip do
|
4
|
+
context ".run" do
|
5
|
+
before do
|
6
6
|
Paperclip.options[:log_command] = false
|
7
7
|
Cocaine::CommandLine.expects(:new).with("convert", "stuff", {}).returns(stub(:run))
|
8
8
|
@original_command_line_path = Cocaine::CommandLine.path
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
after do
|
12
12
|
Paperclip.options[:log_command] = true
|
13
13
|
Cocaine::CommandLine.path = @original_command_line_path
|
14
14
|
end
|
15
15
|
|
16
|
-
|
16
|
+
it "runs the command with Cocaine" do
|
17
17
|
Paperclip.run("convert", "stuff")
|
18
18
|
end
|
19
19
|
|
20
|
-
|
20
|
+
it "saves Cocaine::CommandLine.path that set before" do
|
21
21
|
Cocaine::CommandLine.path = "/opt/my_app/bin"
|
22
22
|
Paperclip.run("convert", "stuff")
|
23
23
|
assert_equal [Cocaine::CommandLine.path].flatten.include?("/opt/my_app/bin"), true
|
24
24
|
end
|
25
25
|
|
26
|
-
|
26
|
+
it "does not duplicate Cocaine::CommandLine.path on multiple runs" do
|
27
27
|
Cocaine::CommandLine.expects(:new).with("convert", "more_stuff", {}).returns(stub(:run))
|
28
28
|
Cocaine::CommandLine.path = nil
|
29
29
|
Paperclip.options[:command_path] = "/opt/my_app/bin"
|
@@ -33,7 +33,7 @@ class PaperclipTest < Test::Unit::TestCase
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
|
36
|
+
it 'does not raise errors when doing a lot of running' do
|
37
37
|
Paperclip.options[:command_path] = ["/usr/local/bin"] * 1024
|
38
38
|
Cocaine::CommandLine.path = "/something/else"
|
39
39
|
100.times do |x|
|
@@ -42,80 +42,80 @@ class PaperclipTest < Test::Unit::TestCase
|
|
42
42
|
end
|
43
43
|
|
44
44
|
context "Calling Paperclip.log without options[:logger] set" do
|
45
|
-
|
45
|
+
before do
|
46
46
|
Paperclip.logger = nil
|
47
47
|
Paperclip.options[:logger] = nil
|
48
48
|
end
|
49
49
|
|
50
|
-
|
50
|
+
after do
|
51
51
|
Paperclip.options[:logger] = ActiveRecord::Base.logger
|
52
52
|
Paperclip.logger = ActiveRecord::Base.logger
|
53
53
|
end
|
54
54
|
|
55
|
-
|
55
|
+
it "does not raise an error when log is called" do
|
56
56
|
silence_stream(STDOUT) do
|
57
57
|
Paperclip.log('something')
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
61
61
|
context "Calling Paperclip.run with a logger" do
|
62
|
-
|
62
|
+
it "passes the defined logger if :log_command is set" do
|
63
63
|
Paperclip.options[:log_command] = true
|
64
|
-
Cocaine::CommandLine.expects(:new).with("convert", "stuff", :
|
64
|
+
Cocaine::CommandLine.expects(:new).with("convert", "stuff", logger: Paperclip.logger).returns(stub(:run))
|
65
65
|
Paperclip.run("convert", "stuff")
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
69
|
context "Paperclip.each_instance_with_attachment" do
|
70
|
-
|
70
|
+
before do
|
71
71
|
@file = File.new(fixture_file("5k.png"), 'rb')
|
72
|
-
d1 = Dummy.create(:
|
72
|
+
d1 = Dummy.create(avatar: @file)
|
73
73
|
d2 = Dummy.create
|
74
|
-
d3 = Dummy.create(:
|
74
|
+
d3 = Dummy.create(avatar: @file)
|
75
75
|
@expected = [d1, d3]
|
76
76
|
end
|
77
77
|
|
78
|
-
|
78
|
+
after { @file.close }
|
79
79
|
|
80
|
-
|
80
|
+
it "yields every instance of a model that has an attachment" do
|
81
81
|
actual = []
|
82
82
|
Paperclip.each_instance_with_attachment("Dummy", "avatar") do |instance|
|
83
83
|
actual << instance
|
84
84
|
end
|
85
|
-
|
85
|
+
expect(actual).to match_array @expected
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
-
|
90
|
-
assert_raises(
|
89
|
+
it "raises when sent #processor and the name of a class that doesn't exist" do
|
90
|
+
assert_raises(LoadError){ Paperclip.processor(:boogey_man) }
|
91
91
|
end
|
92
92
|
|
93
|
-
|
93
|
+
it "returns a class when sent #processor and the name of a class under Paperclip" do
|
94
94
|
assert_equal ::Paperclip::Thumbnail, Paperclip.processor(:thumbnail)
|
95
95
|
end
|
96
96
|
|
97
|
-
|
97
|
+
it "gets a class from a namespaced class name" do
|
98
98
|
class ::One; class Two; end; end
|
99
99
|
assert_equal ::One::Two, Paperclip.class_for("One::Two")
|
100
100
|
end
|
101
101
|
|
102
|
-
|
102
|
+
it "raises when class doesn't exist in specified namespace" do
|
103
103
|
class ::Three; end
|
104
104
|
class ::Four; end
|
105
|
-
|
105
|
+
assert_raises NameError do
|
106
106
|
Paperclip.class_for("Three::Four")
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
110
110
|
context "An ActiveRecord model with an 'avatar' attachment" do
|
111
|
-
|
112
|
-
rebuild_model :
|
111
|
+
before do
|
112
|
+
rebuild_model path: "tmp/:class/omg/:style.:extension"
|
113
113
|
@file = File.new(fixture_file("5k.png"), 'rb')
|
114
114
|
end
|
115
115
|
|
116
|
-
|
116
|
+
after { @file.close }
|
117
117
|
|
118
|
-
|
118
|
+
it "does not error when trying to also create a 'blah' attachment" do
|
119
119
|
assert_nothing_raised do
|
120
120
|
Dummy.class_eval do
|
121
121
|
has_attached_file :blah
|
@@ -125,22 +125,22 @@ class PaperclipTest < Test::Unit::TestCase
|
|
125
125
|
|
126
126
|
if using_protected_attributes?
|
127
127
|
context "that is attr_protected" do
|
128
|
-
|
128
|
+
before do
|
129
129
|
Dummy.class_eval do
|
130
130
|
attr_protected :avatar
|
131
131
|
end
|
132
132
|
@dummy = Dummy.new
|
133
133
|
end
|
134
134
|
|
135
|
-
|
136
|
-
@dummy.attributes = { :
|
137
|
-
:
|
135
|
+
it "does not assign the avatar on mass-set" do
|
136
|
+
@dummy.attributes = { other: "I'm set!",
|
137
|
+
avatar: @file }
|
138
138
|
|
139
139
|
assert_equal "I'm set!", @dummy.other
|
140
140
|
assert ! @dummy.avatar?
|
141
141
|
end
|
142
142
|
|
143
|
-
|
143
|
+
it "allows assigment on normal set" do
|
144
144
|
@dummy.other = "I'm set!"
|
145
145
|
@dummy.avatar = @file
|
146
146
|
|
@@ -151,42 +151,42 @@ class PaperclipTest < Test::Unit::TestCase
|
|
151
151
|
end
|
152
152
|
|
153
153
|
context "with a subclass" do
|
154
|
-
|
154
|
+
before do
|
155
155
|
class ::SubDummy < Dummy; end
|
156
156
|
end
|
157
157
|
|
158
|
-
|
158
|
+
it "is able to use the attachment from the subclass" do
|
159
159
|
assert_nothing_raised do
|
160
|
-
@subdummy = SubDummy.create(:
|
160
|
+
@subdummy = SubDummy.create(avatar: @file)
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
164
|
-
|
164
|
+
after do
|
165
165
|
SubDummy.delete_all
|
166
166
|
Object.send(:remove_const, "SubDummy") rescue nil
|
167
167
|
end
|
168
168
|
end
|
169
169
|
|
170
|
-
|
170
|
+
it "has an avatar getter method" do
|
171
171
|
assert Dummy.new.respond_to?(:avatar)
|
172
172
|
end
|
173
173
|
|
174
|
-
|
174
|
+
it "has an avatar setter method" do
|
175
175
|
assert Dummy.new.respond_to?(:avatar=)
|
176
176
|
end
|
177
177
|
|
178
178
|
context "that is valid" do
|
179
|
-
|
179
|
+
before do
|
180
180
|
@dummy = Dummy.new
|
181
181
|
@dummy.avatar = @file
|
182
182
|
end
|
183
183
|
|
184
|
-
|
184
|
+
it "is valid" do
|
185
185
|
assert @dummy.valid?
|
186
186
|
end
|
187
187
|
end
|
188
188
|
|
189
|
-
|
189
|
+
it "does not have Attachment in the ActiveRecord::Base namespace" do
|
190
190
|
assert_raises(NameError) do
|
191
191
|
ActiveRecord::Base::Attachment
|
192
192
|
end
|
@@ -194,7 +194,7 @@ class PaperclipTest < Test::Unit::TestCase
|
|
194
194
|
end
|
195
195
|
|
196
196
|
context "configuring a custom processor" do
|
197
|
-
|
197
|
+
before do
|
198
198
|
@freedom_processor = Class.new do
|
199
199
|
def make(file, options = {}, attachment = nil)
|
200
200
|
file
|
@@ -206,11 +206,11 @@ class PaperclipTest < Test::Unit::TestCase
|
|
206
206
|
end
|
207
207
|
end
|
208
208
|
|
209
|
-
|
209
|
+
it "is able to find the custom processor" do
|
210
210
|
assert_equal @freedom_processor, Paperclip.processor(:freedom)
|
211
211
|
end
|
212
212
|
|
213
|
-
|
213
|
+
after do
|
214
214
|
Paperclip.clear_processors!
|
215
215
|
end
|
216
216
|
end
|