paperclip 3.5.4 → 4.3.7
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/.hound.yml +1066 -0
- data/.rubocop.yml +1 -0
- data/.travis.yml +11 -17
- data/Appraisals +6 -14
- data/CONTRIBUTING.md +13 -8
- data/Gemfile +16 -3
- data/LICENSE +1 -3
- data/NEWS +167 -49
- data/README.md +294 -75
- data/RELEASING.md +17 -0
- data/Rakefile +6 -8
- data/features/basic_integration.feature +24 -6
- data/features/step_definitions/attachment_steps.rb +30 -22
- data/features/step_definitions/html_steps.rb +2 -2
- data/features/step_definitions/rails_steps.rb +44 -14
- data/features/step_definitions/web_steps.rb +1 -103
- data/features/support/env.rb +2 -2
- data/features/support/file_helpers.rb +2 -2
- data/features/support/fixtures/gemfile.txt +1 -1
- data/features/support/rails.rb +2 -1
- data/gemfiles/3.2.gemfile +14 -6
- data/gemfiles/4.1.gemfile +19 -0
- data/gemfiles/4.2.gemfile +19 -0
- data/lib/generators/paperclip/paperclip_generator.rb +0 -2
- data/lib/generators/paperclip/templates/paperclip_migration.rb.erb +1 -1
- data/lib/paperclip/attachment.rb +132 -38
- data/lib/paperclip/attachment_registry.rb +1 -1
- data/lib/paperclip/callbacks.rb +11 -1
- data/lib/paperclip/content_type_detector.rb +25 -22
- data/lib/paperclip/deprecations.rb +42 -0
- data/lib/paperclip/errors.rb +5 -0
- data/lib/paperclip/file_command_content_type_detector.rb +6 -8
- data/lib/paperclip/geometry_detector_factory.rb +3 -1
- data/lib/paperclip/geometry_parser_factory.rb +1 -1
- data/lib/paperclip/has_attached_file.rb +10 -0
- data/lib/paperclip/interpolations/plural_cache.rb +6 -5
- data/lib/paperclip/interpolations.rb +25 -12
- data/lib/paperclip/io_adapters/abstract_adapter.rb +3 -1
- data/lib/paperclip/io_adapters/attachment_adapter.rb +4 -4
- data/lib/paperclip/io_adapters/data_uri_adapter.rb +5 -10
- data/lib/paperclip/io_adapters/stringio_adapter.rb +6 -10
- data/lib/paperclip/io_adapters/uri_adapter.rb +30 -11
- data/lib/paperclip/locales/de.yml +18 -0
- data/lib/paperclip/locales/en.yml +1 -0
- data/lib/paperclip/locales/es.yml +18 -0
- data/lib/paperclip/locales/ja.yml +18 -0
- data/lib/paperclip/locales/pt-BR.yml +18 -0
- data/lib/paperclip/locales/zh-CN.yml +18 -0
- data/lib/paperclip/locales/zh-HK.yml +18 -0
- data/lib/paperclip/locales/zh-TW.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 +89 -0
- data/lib/paperclip/processor.rb +0 -37
- data/lib/paperclip/processor_helpers.rb +50 -0
- data/lib/paperclip/rails_environment.rb +25 -0
- data/lib/paperclip/schema.rb +10 -2
- data/lib/paperclip/storage/filesystem.rb +1 -1
- data/lib/paperclip/storage/fog.rb +18 -7
- data/lib/paperclip/storage/s3.rb +53 -22
- data/lib/paperclip/style.rb +8 -2
- data/lib/paperclip/tempfile_factory.rb +5 -1
- data/lib/paperclip/thumbnail.rb +12 -10
- data/lib/paperclip/url_generator.rb +11 -3
- data/lib/paperclip/validators/attachment_content_type_validator.rb +4 -0
- data/lib/paperclip/validators/attachment_file_name_validator.rb +80 -0
- data/lib/paperclip/validators/attachment_file_type_ignorance_validator.rb +29 -0
- data/lib/paperclip/validators/attachment_presence_validator.rb +4 -0
- data/lib/paperclip/validators/attachment_size_validator.rb +11 -3
- data/lib/paperclip/validators/media_type_spoof_detection_validator.rb +27 -0
- data/lib/paperclip/validators.rb +10 -3
- data/lib/paperclip/version.rb +1 -1
- data/lib/paperclip.rb +26 -8
- data/lib/tasks/paperclip.rake +17 -2
- data/paperclip.gemspec +16 -14
- data/shoulda_macros/paperclip.rb +0 -1
- data/spec/paperclip/attachment_definitions_spec.rb +13 -0
- data/{test/attachment_processing_test.rb → spec/paperclip/attachment_processing_spec.rb} +20 -21
- data/spec/paperclip/attachment_registry_spec.rb +130 -0
- data/{test/attachment_test.rb → spec/paperclip/attachment_spec.rb} +438 -397
- data/{test/content_type_detector_test.rb → spec/paperclip/content_type_detector_spec.rb} +16 -19
- data/spec/paperclip/deprecations_spec.rb +65 -0
- data/{test/file_command_content_type_detector_test.rb → spec/paperclip/file_command_content_type_detector_spec.rb} +5 -6
- 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} +50 -52
- data/spec/paperclip/glue_spec.rb +44 -0
- data/{test/has_attached_file_test.rb → spec/paperclip/has_attached_file_spec.rb} +45 -28
- data/{test/integration_test.rb → spec/paperclip/integration_spec.rb} +134 -126
- data/{test/interpolations_test.rb → spec/paperclip/interpolations_spec.rb} +70 -46
- data/spec/paperclip/io_adapters/abstract_adapter_spec.rb +78 -0
- 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} +26 -17
- 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} +36 -40
- data/{test/io_adapters/http_url_proxy_adapter_test.rb → spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb} +31 -29
- 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} +20 -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} +53 -28
- 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/spec/paperclip/media_type_spoof_detector_spec.rb +79 -0
- 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} +53 -48
- data/spec/paperclip/plural_cache_spec.rb +37 -0
- data/spec/paperclip/processor_helpers_spec.rb +57 -0
- data/{test/processor_test.rb → spec/paperclip/processor_spec.rb} +5 -5
- data/spec/paperclip/rails_environment_spec.rb +33 -0
- data/{test/rake_test.rb → spec/paperclip/rake_spec.rb} +15 -15
- data/spec/paperclip/schema_spec.rb +248 -0
- data/{test/storage/filesystem_test.rb → spec/paperclip/storage/filesystem_spec.rb} +18 -18
- data/spec/paperclip/storage/fog_spec.rb +535 -0
- data/spec/paperclip/storage/s3_live_spec.rb +182 -0
- data/spec/paperclip/storage/s3_spec.rb +1526 -0
- data/spec/paperclip/style_spec.rb +255 -0
- data/spec/paperclip/tempfile_factory_spec.rb +33 -0
- data/{test/thumbnail_test.rb → spec/paperclip/thumbnail_spec.rb} +123 -107
- data/spec/paperclip/url_generator_spec.rb +211 -0
- 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} +20 -20
- data/{test/validators/attachment_size_validator_test.rb → spec/paperclip/validators/attachment_size_validator_spec.rb} +65 -58
- data/spec/paperclip/validators/media_type_spoof_detection_validator_spec.rb +52 -0
- data/spec/paperclip/validators_spec.rb +164 -0
- data/spec/spec_helper.rb +43 -0
- data/spec/support/assertions.rb +71 -0
- data/spec/support/deprecations.rb +9 -0
- data/spec/support/fake_model.rb +25 -0
- data/spec/support/fake_rails.rb +12 -0
- data/spec/support/fixtures/empty.html +1 -0
- data/spec/support/fixtures/empty.xlsx +0 -0
- data/spec/support/fixtures/spaced file.jpg +0 -0
- data/spec/support/matchers/accept.rb +5 -0
- data/spec/support/matchers/exist.rb +5 -0
- data/spec/support/matchers/have_column.rb +23 -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 +334 -219
- data/RUNNING_TESTS.md +0 -4
- data/gemfiles/3.0.gemfile +0 -11
- data/gemfiles/3.1.gemfile +0 -11
- data/gemfiles/4.0.gemfile +0 -11
- data/test/attachment_definitions_test.rb +0 -12
- data/test/attachment_registry_test.rb +0 -88
- 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 -232
- data/test/io_adapters/abstract_adapter_test.rb +0 -58
- 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 -24
- data/test/matchers/validate_attachment_content_type_matcher_test.rb +0 -110
- data/test/matchers/validate_attachment_presence_matcher_test.rb +0 -69
- data/test/matchers/validate_attachment_size_matcher_test.rb +0 -86
- data/test/meta_class_test.rb +0 -32
- data/test/paperclip_missing_attachment_styles_test.rb +0 -90
- data/test/plural_cache_test.rb +0 -36
- data/test/schema_test.rb +0 -200
- data/test/storage/fog_test.rb +0 -473
- data/test/storage/s3_live_test.rb +0 -179
- data/test/storage/s3_test.rb +0 -1356
- data/test/style_test.rb +0 -213
- data/test/support/mock_model.rb +0 -2
- data/test/tempfile_factory_test.rb +0 -17
- data/test/url_generator_test.rb +0 -187
- data/test/validators/attachment_content_type_validator_test.rb +0 -324
- data/test/validators_test.rb +0 -61
- /data/{test → spec}/database.yml +0 -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/fog.yml +0 -0
- /data/{test → spec/support}/fixtures/rotated.jpg +0 -0
- /data/{test → spec/support}/fixtures/s3.yml +0 -0
- /data/{test → 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/{test → spec}/support/mock_attachment.rb +0 -0
- /data/{test → spec}/support/mock_interpolator.rb +0 -0
- /data/{test → spec}/support/mock_url_generator_builder.rb +0 -0
data/{test/io_adapters/file_adapter_test.rb → spec/paperclip/io_adapters/file_adapter_spec.rb}
RENAMED
@@ -1,53 +1,57 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
describe Paperclip::FileAdapter do
|
4
4
|
context "a new instance" do
|
5
5
|
context "with normal file" do
|
6
|
-
|
6
|
+
before do
|
7
7
|
@file = File.new(fixture_file("5k.png"))
|
8
8
|
@file.binmode
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
after do
|
12
12
|
@file.close
|
13
13
|
@subject.close if @subject
|
14
14
|
end
|
15
15
|
|
16
16
|
context 'doing normal things' do
|
17
|
-
|
17
|
+
before do
|
18
18
|
@subject = Paperclip.io_adapters.for(@file)
|
19
19
|
end
|
20
20
|
|
21
|
-
|
21
|
+
it 'uses the original filename to generate the tempfile' do
|
22
|
+
assert @subject.path.ends_with?(".png")
|
23
|
+
end
|
24
|
+
|
25
|
+
it "gets the right filename" do
|
22
26
|
assert_equal "5k.png", @subject.original_filename
|
23
27
|
end
|
24
28
|
|
25
|
-
|
29
|
+
it "forces binmode on tempfile" do
|
26
30
|
assert @subject.instance_variable_get("@tempfile").binmode?
|
27
31
|
end
|
28
32
|
|
29
|
-
|
33
|
+
it "gets the content type" do
|
30
34
|
assert_equal "image/png", @subject.content_type
|
31
35
|
end
|
32
36
|
|
33
|
-
|
34
|
-
|
37
|
+
it "returns content type as a string" do
|
38
|
+
expect(@subject.content_type).to be_a String
|
35
39
|
end
|
36
40
|
|
37
|
-
|
41
|
+
it "gets the file's size" do
|
38
42
|
assert_equal 4456, @subject.size
|
39
43
|
end
|
40
44
|
|
41
|
-
|
45
|
+
it "returns false for a call to nil?" do
|
42
46
|
assert ! @subject.nil?
|
43
47
|
end
|
44
48
|
|
45
|
-
|
49
|
+
it "generates a MD5 hash of the contents" do
|
46
50
|
expected = Digest::MD5.file(@file.path).to_s
|
47
51
|
assert_equal expected, @subject.fingerprint
|
48
52
|
end
|
49
53
|
|
50
|
-
|
54
|
+
it "reads the contents of the file" do
|
51
55
|
expected = @file.read
|
52
56
|
assert expected.length > 0
|
53
57
|
assert_equal expected, @subject.read
|
@@ -55,46 +59,38 @@ class FileAdapterTest < Test::Unit::TestCase
|
|
55
59
|
end
|
56
60
|
|
57
61
|
context "file with multiple possible content type" do
|
58
|
-
|
62
|
+
before do
|
59
63
|
MIME::Types.stubs(:type_for).returns([MIME::Type.new('image/x-png'), MIME::Type.new('image/png')])
|
60
64
|
@subject = Paperclip.io_adapters.for(@file)
|
61
65
|
end
|
62
66
|
|
63
|
-
|
67
|
+
it "prefers officially registered mime type" do
|
64
68
|
assert_equal "image/png", @subject.content_type
|
65
69
|
end
|
66
70
|
|
67
|
-
|
68
|
-
|
71
|
+
it "returns content type as a string" do
|
72
|
+
expect(@subject.content_type).to be_a String
|
69
73
|
end
|
70
74
|
end
|
71
75
|
|
72
|
-
context "file with
|
73
|
-
|
74
|
-
MIME::Types.stubs(:type_for).returns([MIME::Type.new('image/x-mp4'), MIME::Type.new('image/x-video')])
|
75
|
-
@subject = Paperclip.io_adapters.for(@file)
|
76
|
-
end
|
77
|
-
|
78
|
-
should "return the first" do
|
79
|
-
assert_equal "image/x-mp4", @subject.content_type
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
context "file with content type derived from file command on *nix" do
|
84
|
-
setup do
|
76
|
+
context "file with content type derived from file contents on *nix" do
|
77
|
+
before do
|
85
78
|
MIME::Types.stubs(:type_for).returns([])
|
86
79
|
Paperclip.stubs(:run).returns("application/vnd.ms-office\n")
|
80
|
+
Paperclip::ContentTypeDetector.any_instance
|
81
|
+
.stubs(:type_from_mime_magic).returns("application/vnd.ms-office")
|
82
|
+
|
87
83
|
@subject = Paperclip.io_adapters.for(@file)
|
88
84
|
end
|
89
85
|
|
90
|
-
|
86
|
+
it "returns content type without newline character" do
|
91
87
|
assert_equal "application/vnd.ms-office", @subject.content_type
|
92
88
|
end
|
93
89
|
end
|
94
90
|
end
|
95
91
|
|
96
92
|
context "filename with restricted characters" do
|
97
|
-
|
93
|
+
before do
|
98
94
|
@file = File.open(fixture_file("animated.gif")) do |file|
|
99
95
|
StringIO.new(file.read)
|
100
96
|
end
|
@@ -102,32 +98,32 @@ class FileAdapterTest < Test::Unit::TestCase
|
|
102
98
|
@subject = Paperclip.io_adapters.for(@file)
|
103
99
|
end
|
104
100
|
|
105
|
-
|
101
|
+
after do
|
106
102
|
@file.close
|
107
103
|
@subject.close
|
108
104
|
end
|
109
105
|
|
110
|
-
|
106
|
+
it "does not generate filenames that include restricted characters" do
|
111
107
|
assert_equal 'image_restricted.gif', @subject.original_filename
|
112
108
|
end
|
113
109
|
|
114
|
-
|
115
|
-
|
110
|
+
it "does not generate paths that include restricted characters" do
|
111
|
+
expect(@subject.path).to_not match(/:/)
|
116
112
|
end
|
117
113
|
end
|
118
114
|
|
119
115
|
context "empty file" do
|
120
|
-
|
116
|
+
before do
|
121
117
|
@file = Tempfile.new("file_adapter_test")
|
122
118
|
@subject = Paperclip.io_adapters.for(@file)
|
123
119
|
end
|
124
120
|
|
125
|
-
|
121
|
+
after do
|
126
122
|
@file.close
|
127
123
|
@subject.close
|
128
124
|
end
|
129
125
|
|
130
|
-
|
126
|
+
it "provides correct mime-type" do
|
131
127
|
assert_match %r{.*/x-empty}, @subject.content_type
|
132
128
|
end
|
133
129
|
end
|
@@ -1,101 +1,103 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Paperclip::HttpUrlProxyAdapter do
|
4
|
+
before do
|
5
|
+
@open_return = StringIO.new("xxx")
|
6
|
+
@open_return.stubs(:content_type).returns("image/png")
|
7
|
+
@open_return.stubs(:meta).returns({})
|
8
|
+
Paperclip::HttpUrlProxyAdapter.any_instance.
|
9
|
+
stubs(:download_content).returns(@open_return)
|
10
|
+
end
|
2
11
|
|
3
|
-
class HttpUrlProxyAdapterTest < Test::Unit::TestCase
|
4
12
|
context "a new instance" do
|
5
|
-
|
6
|
-
@open_return = StringIO.new("xxx")
|
7
|
-
@open_return.stubs(:content_type).returns("image/png")
|
8
|
-
Paperclip::HttpUrlProxyAdapter.any_instance.stubs(:download_content).returns(@open_return)
|
13
|
+
before do
|
9
14
|
@url = "http://thoughtbot.com/images/thoughtbot-logo.png"
|
10
15
|
@subject = Paperclip.io_adapters.for(@url)
|
11
16
|
end
|
12
17
|
|
13
|
-
|
18
|
+
after do
|
14
19
|
@subject.close
|
15
20
|
end
|
16
21
|
|
17
|
-
|
22
|
+
it "returns a file name" do
|
18
23
|
assert_equal "thoughtbot-logo.png", @subject.original_filename
|
19
24
|
end
|
20
25
|
|
21
|
-
|
26
|
+
it 'closes open handle after reading' do
|
22
27
|
assert_equal true, @open_return.closed?
|
23
28
|
end
|
24
29
|
|
25
|
-
|
30
|
+
it "returns a content type" do
|
26
31
|
assert_equal "image/png", @subject.content_type
|
27
32
|
end
|
28
33
|
|
29
|
-
|
34
|
+
it "returns the size of the data" do
|
30
35
|
assert_equal @open_return.size, @subject.size
|
31
36
|
end
|
32
37
|
|
33
|
-
|
38
|
+
it "generates an MD5 hash of the contents" do
|
34
39
|
assert_equal Digest::MD5.hexdigest("xxx"), @subject.fingerprint
|
35
40
|
end
|
36
41
|
|
37
|
-
|
42
|
+
it "generates correct fingerprint after read" do
|
38
43
|
fingerprint = Digest::MD5.hexdigest(@subject.read)
|
39
44
|
assert_equal fingerprint, @subject.fingerprint
|
40
45
|
end
|
41
46
|
|
42
|
-
|
47
|
+
it "generates same fingerprint" do
|
43
48
|
assert_equal @subject.fingerprint, @subject.fingerprint
|
44
49
|
end
|
45
50
|
|
46
|
-
|
51
|
+
it "returns the data contained in the StringIO" do
|
47
52
|
assert_equal "xxx", @subject.read
|
48
53
|
end
|
49
54
|
|
50
|
-
|
55
|
+
it 'accepts a content_type' do
|
51
56
|
@subject.content_type = 'image/png'
|
52
57
|
assert_equal 'image/png', @subject.content_type
|
53
58
|
end
|
54
59
|
|
55
|
-
|
60
|
+
it 'accepts an original_filename' do
|
56
61
|
@subject.original_filename = 'image.png'
|
57
62
|
assert_equal 'image.png', @subject.original_filename
|
58
63
|
end
|
59
64
|
end
|
60
65
|
|
61
66
|
context "a url with query params" do
|
62
|
-
|
63
|
-
Paperclip::HttpUrlProxyAdapter.any_instance.stubs(:download_content).returns(StringIO.new("x"))
|
67
|
+
before do
|
64
68
|
@url = "https://github.com/thoughtbot/paperclip?file=test"
|
65
69
|
@subject = Paperclip.io_adapters.for(@url)
|
66
70
|
end
|
67
71
|
|
68
|
-
|
72
|
+
after do
|
69
73
|
@subject.close
|
70
74
|
end
|
71
75
|
|
72
|
-
|
76
|
+
it "returns a file name" do
|
73
77
|
assert_equal "paperclip", @subject.original_filename
|
74
78
|
end
|
75
79
|
end
|
76
80
|
|
77
81
|
context "a url with restricted characters in the filename" do
|
78
|
-
|
79
|
-
Paperclip::HttpUrlProxyAdapter.any_instance.stubs(:download_content).returns(StringIO.new("x"))
|
82
|
+
before do
|
80
83
|
@url = "https://github.com/thoughtbot/paper:clip.jpg"
|
81
84
|
@subject = Paperclip.io_adapters.for(@url)
|
82
85
|
end
|
83
86
|
|
84
|
-
|
87
|
+
after do
|
85
88
|
begin
|
86
89
|
@subject.close
|
87
|
-
rescue Exception
|
88
|
-
binding.pry
|
90
|
+
rescue Exception
|
89
91
|
true
|
90
92
|
end
|
91
93
|
end
|
92
94
|
|
93
|
-
|
95
|
+
it "does not generate filenames that include restricted characters" do
|
94
96
|
assert_equal "paper_clip.jpg", @subject.original_filename
|
95
97
|
end
|
96
98
|
|
97
|
-
|
98
|
-
|
99
|
+
it "does not generate paths that include restricted characters" do
|
100
|
+
expect(@subject.path).to_not match(/:/)
|
99
101
|
end
|
100
102
|
end
|
101
103
|
|
data/{test/io_adapters/nil_adapter_test.rb → spec/paperclip/io_adapters/nil_adapter_spec.rb}
RENAMED
@@ -1,24 +1,24 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
describe Paperclip::NilAdapter do
|
4
4
|
context 'a new instance' do
|
5
|
-
|
5
|
+
before do
|
6
6
|
@subject = Paperclip.io_adapters.for(nil)
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
it "gets the right filename" do
|
10
10
|
assert_equal "", @subject.original_filename
|
11
11
|
end
|
12
12
|
|
13
|
-
|
13
|
+
it "gets the content type" do
|
14
14
|
assert_equal "", @subject.content_type
|
15
15
|
end
|
16
16
|
|
17
|
-
|
17
|
+
it "gets the file's size" do
|
18
18
|
assert_equal 0, @subject.size
|
19
19
|
end
|
20
20
|
|
21
|
-
|
21
|
+
it "returns true for a call to nil?" do
|
22
22
|
assert @subject.nil?
|
23
23
|
end
|
24
24
|
end
|
@@ -1,31 +1,34 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
describe Paperclip::AttachmentRegistry do
|
4
4
|
context "for" do
|
5
|
-
|
5
|
+
before do
|
6
6
|
class AdapterTest
|
7
7
|
def initialize(target); end
|
8
8
|
end
|
9
9
|
@subject = Paperclip::AdapterRegistry.new
|
10
10
|
@subject.register(AdapterTest){|t| Symbol === t }
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
|
+
it "returns the class registered for the adapted type" do
|
13
14
|
assert_equal AdapterTest, @subject.for(:target).class
|
14
15
|
end
|
15
16
|
end
|
16
17
|
|
17
18
|
context "registered?" do
|
18
|
-
|
19
|
+
before do
|
19
20
|
class AdapterTest
|
20
21
|
def initialize(target); end
|
21
22
|
end
|
22
23
|
@subject = Paperclip::AdapterRegistry.new
|
23
24
|
@subject.register(AdapterTest){|t| Symbol === t }
|
24
25
|
end
|
25
|
-
|
26
|
+
|
27
|
+
it "returns true when the class of this adapter has been registered" do
|
26
28
|
assert @subject.registered?(AdapterTest.new(:target))
|
27
29
|
end
|
28
|
-
|
30
|
+
|
31
|
+
it "returns false when the adapter has not been registered" do
|
29
32
|
assert ! @subject.registered?(Object)
|
30
33
|
end
|
31
34
|
end
|
@@ -1,61 +1,64 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
describe Paperclip::StringioAdapter do
|
4
4
|
context "a new instance" do
|
5
|
-
|
5
|
+
before do
|
6
6
|
@contents = "abc123"
|
7
7
|
@stringio = StringIO.new(@contents)
|
8
8
|
@subject = Paperclip.io_adapters.for(@stringio)
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
assert_equal "
|
11
|
+
it "returns a file name" do
|
12
|
+
assert_equal "data", @subject.original_filename
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
it "returns a content type" do
|
16
16
|
assert_equal "text/plain", @subject.content_type
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
it "returns the size of the data" do
|
20
20
|
assert_equal 6, @subject.size
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
it "returns the length of the data" do
|
24
|
+
assert_equal 6, @subject.length
|
25
|
+
end
|
26
|
+
|
27
|
+
it "generates an MD5 hash of the contents" do
|
24
28
|
assert_equal Digest::MD5.hexdigest(@contents), @subject.fingerprint
|
25
29
|
end
|
26
30
|
|
27
|
-
|
31
|
+
it "generates correct fingerprint after read" do
|
28
32
|
fingerprint = Digest::MD5.hexdigest(@subject.read)
|
29
33
|
assert_equal fingerprint, @subject.fingerprint
|
30
34
|
end
|
31
35
|
|
32
|
-
|
36
|
+
it "generates same fingerprint" do
|
33
37
|
assert_equal @subject.fingerprint, @subject.fingerprint
|
34
38
|
end
|
35
39
|
|
36
|
-
|
40
|
+
it "returns the data contained in the StringIO" do
|
37
41
|
assert_equal "abc123", @subject.read
|
38
42
|
end
|
39
43
|
|
40
|
-
|
44
|
+
it 'accepts a content_type' do
|
41
45
|
@subject.content_type = 'image/png'
|
42
46
|
assert_equal 'image/png', @subject.content_type
|
43
47
|
end
|
44
48
|
|
45
|
-
|
49
|
+
it 'accepts an original_filename' do
|
46
50
|
@subject.original_filename = 'image.png'
|
47
51
|
assert_equal 'image.png', @subject.original_filename
|
48
52
|
end
|
49
53
|
|
50
|
-
|
54
|
+
it "does not generate filenames that include restricted characters" do
|
51
55
|
@subject.original_filename = 'image:restricted.png'
|
52
56
|
assert_equal 'image_restricted.png', @subject.original_filename
|
53
57
|
end
|
54
58
|
|
55
|
-
|
59
|
+
it "does not generate paths that include restricted characters" do
|
56
60
|
@subject.original_filename = 'image:restricted.png'
|
57
|
-
|
61
|
+
expect(@subject.path).to_not match(/:/)
|
58
62
|
end
|
59
|
-
|
60
63
|
end
|
61
64
|
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
describe Paperclip::UploadedFileAdapter do
|
4
4
|
context "a new instance" do
|
5
5
|
context "with UploadedFile responding to #tempfile" do
|
6
|
-
|
6
|
+
before do
|
7
7
|
Paperclip::UploadedFileAdapter.content_type_detector = nil
|
8
8
|
|
9
9
|
class UploadedFile < OpenStruct; end
|
@@ -11,41 +11,41 @@ class UploadedFileAdapterTest < Test::Unit::TestCase
|
|
11
11
|
tempfile.binmode
|
12
12
|
|
13
13
|
@file = UploadedFile.new(
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
18
|
-
:
|
14
|
+
original_filename: "5k.png",
|
15
|
+
content_type: "image/x-png-by-browser\r",
|
16
|
+
head: "",
|
17
|
+
tempfile: tempfile,
|
18
|
+
path: tempfile.path
|
19
19
|
)
|
20
20
|
@subject = Paperclip.io_adapters.for(@file)
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
it "gets the right filename" do
|
24
24
|
assert_equal "5k.png", @subject.original_filename
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
it "forces binmode on tempfile" do
|
28
28
|
assert @subject.instance_variable_get("@tempfile").binmode?
|
29
29
|
end
|
30
30
|
|
31
|
-
|
31
|
+
it "gets the content type" do
|
32
32
|
assert_equal "image/x-png-by-browser", @subject.content_type
|
33
33
|
end
|
34
34
|
|
35
|
-
|
35
|
+
it "gets the file's size" do
|
36
36
|
assert_equal 4456, @subject.size
|
37
37
|
end
|
38
38
|
|
39
|
-
|
39
|
+
it "returns false for a call to nil?" do
|
40
40
|
assert ! @subject.nil?
|
41
41
|
end
|
42
42
|
|
43
|
-
|
43
|
+
it "generates a MD5 hash of the contents" do
|
44
44
|
expected = Digest::MD5.file(@file.tempfile.path).to_s
|
45
45
|
assert_equal expected, @subject.fingerprint
|
46
46
|
end
|
47
47
|
|
48
|
-
|
48
|
+
it "reads the contents of the file" do
|
49
49
|
expected = @file.tempfile.read
|
50
50
|
assert expected.length > 0
|
51
51
|
assert_equal expected, @subject.read
|
@@ -53,68 +53,68 @@ class UploadedFileAdapterTest < Test::Unit::TestCase
|
|
53
53
|
end
|
54
54
|
|
55
55
|
context "with UploadedFile that has restricted characters" do
|
56
|
-
|
56
|
+
before do
|
57
57
|
Paperclip::UploadedFileAdapter.content_type_detector = nil
|
58
58
|
|
59
59
|
class UploadedFile < OpenStruct; end
|
60
60
|
@file = UploadedFile.new(
|
61
|
-
:
|
62
|
-
:
|
63
|
-
:
|
64
|
-
:
|
61
|
+
original_filename: "image:restricted.gif",
|
62
|
+
content_type: "image/x-png-by-browser",
|
63
|
+
head: "",
|
64
|
+
path: fixture_file("5k.png")
|
65
65
|
)
|
66
66
|
@subject = Paperclip.io_adapters.for(@file)
|
67
67
|
end
|
68
68
|
|
69
|
-
|
70
|
-
|
69
|
+
it "does not generate paths that include restricted characters" do
|
70
|
+
expect(@subject.path).to_not match(/:/)
|
71
71
|
end
|
72
72
|
|
73
|
-
|
73
|
+
it "does not generate filenames that include restricted characters" do
|
74
74
|
assert_equal 'image_restricted.gif', @subject.original_filename
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
78
|
context "with UploadFile responding to #path" do
|
79
|
-
|
79
|
+
before do
|
80
80
|
Paperclip::UploadedFileAdapter.content_type_detector = nil
|
81
81
|
|
82
82
|
class UploadedFile < OpenStruct; end
|
83
83
|
@file = UploadedFile.new(
|
84
|
-
:
|
85
|
-
:
|
86
|
-
:
|
87
|
-
:
|
84
|
+
original_filename: "5k.png",
|
85
|
+
content_type: "image/x-png-by-browser",
|
86
|
+
head: "",
|
87
|
+
path: fixture_file("5k.png")
|
88
88
|
)
|
89
89
|
@subject = Paperclip.io_adapters.for(@file)
|
90
90
|
end
|
91
91
|
|
92
|
-
|
92
|
+
it "gets the right filename" do
|
93
93
|
assert_equal "5k.png", @subject.original_filename
|
94
94
|
end
|
95
95
|
|
96
|
-
|
96
|
+
it "forces binmode on tempfile" do
|
97
97
|
assert @subject.instance_variable_get("@tempfile").binmode?
|
98
98
|
end
|
99
99
|
|
100
|
-
|
100
|
+
it "gets the content type" do
|
101
101
|
assert_equal "image/x-png-by-browser", @subject.content_type
|
102
102
|
end
|
103
103
|
|
104
|
-
|
104
|
+
it "gets the file's size" do
|
105
105
|
assert_equal 4456, @subject.size
|
106
106
|
end
|
107
107
|
|
108
|
-
|
108
|
+
it "returns false for a call to nil?" do
|
109
109
|
assert ! @subject.nil?
|
110
110
|
end
|
111
111
|
|
112
|
-
|
112
|
+
it "generates a MD5 hash of the contents" do
|
113
113
|
expected = Digest::MD5.file(@file.path).to_s
|
114
114
|
assert_equal expected, @subject.fingerprint
|
115
115
|
end
|
116
116
|
|
117
|
-
|
117
|
+
it "reads the contents of the file" do
|
118
118
|
expected_file = File.new(@file.path)
|
119
119
|
expected_file.binmode
|
120
120
|
expected = expected_file.read
|
@@ -123,21 +123,21 @@ class UploadedFileAdapterTest < Test::Unit::TestCase
|
|
123
123
|
end
|
124
124
|
|
125
125
|
context "don't trust client-given MIME type" do
|
126
|
-
|
126
|
+
before do
|
127
127
|
Paperclip::UploadedFileAdapter.content_type_detector =
|
128
128
|
Paperclip::FileCommandContentTypeDetector
|
129
129
|
|
130
130
|
class UploadedFile < OpenStruct; end
|
131
131
|
@file = UploadedFile.new(
|
132
|
-
:
|
133
|
-
:
|
134
|
-
:
|
135
|
-
:
|
132
|
+
original_filename: "5k.png",
|
133
|
+
content_type: "image/x-png-by-browser",
|
134
|
+
head: "",
|
135
|
+
path: fixture_file("5k.png")
|
136
136
|
)
|
137
137
|
@subject = Paperclip.io_adapters.for(@file)
|
138
138
|
end
|
139
139
|
|
140
|
-
|
140
|
+
it "gets the content type" do
|
141
141
|
assert_equal "image/png", @subject.content_type
|
142
142
|
end
|
143
143
|
end
|