kt-paperclip 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.codeclimate.yml +17 -0
- data/.github/issue_template.md +3 -0
- data/.gitignore +19 -0
- data/.hound.yml +1050 -0
- data/.rubocop.yml +1 -0
- data/.travis.yml +47 -0
- data/Appraisals +24 -0
- data/CONTRIBUTING.md +86 -0
- data/Gemfile +18 -0
- data/LICENSE +24 -0
- data/NEWS +515 -0
- data/README.md +1053 -0
- data/RELEASING.md +17 -0
- data/Rakefile +52 -0
- data/UPGRADING +17 -0
- data/features/basic_integration.feature +85 -0
- data/features/migration.feature +29 -0
- data/features/rake_tasks.feature +62 -0
- data/features/step_definitions/attachment_steps.rb +110 -0
- data/features/step_definitions/html_steps.rb +15 -0
- data/features/step_definitions/rails_steps.rb +257 -0
- data/features/step_definitions/s3_steps.rb +14 -0
- data/features/step_definitions/web_steps.rb +106 -0
- data/features/support/env.rb +12 -0
- data/features/support/fakeweb.rb +11 -0
- data/features/support/file_helpers.rb +34 -0
- data/features/support/fixtures/boot_config.txt +15 -0
- data/features/support/fixtures/gemfile.txt +5 -0
- data/features/support/fixtures/preinitializer.txt +20 -0
- data/features/support/paths.rb +28 -0
- data/features/support/rails.rb +39 -0
- data/features/support/selectors.rb +19 -0
- data/gemfiles/4.2.gemfile +20 -0
- data/gemfiles/5.0.gemfile +20 -0
- data/gemfiles/5.1.gemfile +20 -0
- data/gemfiles/5.2.gemfile +20 -0
- data/gemfiles/6.0.gemfile +20 -0
- data/lib/generators/paperclip/USAGE +8 -0
- data/lib/generators/paperclip/paperclip_generator.rb +36 -0
- data/lib/generators/paperclip/templates/paperclip_migration.rb.erb +15 -0
- data/lib/paperclip.rb +215 -0
- data/lib/paperclip/attachment.rb +617 -0
- data/lib/paperclip/attachment_registry.rb +60 -0
- data/lib/paperclip/callbacks.rb +42 -0
- data/lib/paperclip/content_type_detector.rb +80 -0
- data/lib/paperclip/errors.rb +34 -0
- data/lib/paperclip/file_command_content_type_detector.rb +28 -0
- data/lib/paperclip/filename_cleaner.rb +15 -0
- data/lib/paperclip/geometry.rb +157 -0
- data/lib/paperclip/geometry_detector_factory.rb +45 -0
- data/lib/paperclip/geometry_parser_factory.rb +31 -0
- data/lib/paperclip/glue.rb +17 -0
- data/lib/paperclip/has_attached_file.rb +116 -0
- data/lib/paperclip/helpers.rb +60 -0
- data/lib/paperclip/interpolations.rb +201 -0
- data/lib/paperclip/interpolations/plural_cache.rb +18 -0
- data/lib/paperclip/io_adapters/abstract_adapter.rb +75 -0
- data/lib/paperclip/io_adapters/attachment_adapter.rb +47 -0
- data/lib/paperclip/io_adapters/data_uri_adapter.rb +22 -0
- data/lib/paperclip/io_adapters/empty_string_adapter.rb +19 -0
- data/lib/paperclip/io_adapters/file_adapter.rb +26 -0
- data/lib/paperclip/io_adapters/http_url_proxy_adapter.rb +16 -0
- data/lib/paperclip/io_adapters/identity_adapter.rb +17 -0
- data/lib/paperclip/io_adapters/nil_adapter.rb +37 -0
- data/lib/paperclip/io_adapters/registry.rb +36 -0
- data/lib/paperclip/io_adapters/stringio_adapter.rb +36 -0
- data/lib/paperclip/io_adapters/uploaded_file_adapter.rb +44 -0
- data/lib/paperclip/io_adapters/uri_adapter.rb +68 -0
- data/lib/paperclip/locales/en.yml +18 -0
- data/lib/paperclip/logger.rb +21 -0
- data/lib/paperclip/matchers.rb +64 -0
- data/lib/paperclip/matchers/have_attached_file_matcher.rb +54 -0
- data/lib/paperclip/matchers/validate_attachment_content_type_matcher.rb +101 -0
- data/lib/paperclip/matchers/validate_attachment_presence_matcher.rb +59 -0
- data/lib/paperclip/matchers/validate_attachment_size_matcher.rb +97 -0
- data/lib/paperclip/media_type_spoof_detector.rb +90 -0
- data/lib/paperclip/missing_attachment_styles.rb +84 -0
- data/lib/paperclip/processor.rb +56 -0
- data/lib/paperclip/processor_helpers.rb +52 -0
- data/lib/paperclip/rails_environment.rb +21 -0
- data/lib/paperclip/railtie.rb +31 -0
- data/lib/paperclip/schema.rb +81 -0
- data/lib/paperclip/storage.rb +3 -0
- data/lib/paperclip/storage/filesystem.rb +99 -0
- data/lib/paperclip/storage/fog.rb +252 -0
- data/lib/paperclip/storage/s3.rb +461 -0
- data/lib/paperclip/style.rb +106 -0
- data/lib/paperclip/tempfile.rb +42 -0
- data/lib/paperclip/tempfile_factory.rb +22 -0
- data/lib/paperclip/thumbnail.rb +131 -0
- data/lib/paperclip/url_generator.rb +76 -0
- data/lib/paperclip/validators.rb +73 -0
- data/lib/paperclip/validators/attachment_content_type_validator.rb +88 -0
- data/lib/paperclip/validators/attachment_file_name_validator.rb +75 -0
- data/lib/paperclip/validators/attachment_file_type_ignorance_validator.rb +28 -0
- data/lib/paperclip/validators/attachment_presence_validator.rb +28 -0
- data/lib/paperclip/validators/attachment_size_validator.rb +109 -0
- data/lib/paperclip/validators/media_type_spoof_detection_validator.rb +29 -0
- data/lib/paperclip/version.rb +3 -0
- data/lib/tasks/paperclip.rake +140 -0
- data/paperclip.gemspec +50 -0
- data/shoulda_macros/paperclip.rb +134 -0
- data/spec/database.yml +4 -0
- data/spec/paperclip/attachment_definitions_spec.rb +13 -0
- data/spec/paperclip/attachment_processing_spec.rb +79 -0
- data/spec/paperclip/attachment_registry_spec.rb +158 -0
- data/spec/paperclip/attachment_spec.rb +1590 -0
- data/spec/paperclip/content_type_detector_spec.rb +47 -0
- data/spec/paperclip/file_command_content_type_detector_spec.rb +40 -0
- data/spec/paperclip/filename_cleaner_spec.rb +13 -0
- data/spec/paperclip/geometry_detector_spec.rb +38 -0
- data/spec/paperclip/geometry_parser_spec.rb +73 -0
- data/spec/paperclip/geometry_spec.rb +255 -0
- data/spec/paperclip/glue_spec.rb +42 -0
- data/spec/paperclip/has_attached_file_spec.rb +78 -0
- data/spec/paperclip/integration_spec.rb +702 -0
- data/spec/paperclip/interpolations_spec.rb +270 -0
- data/spec/paperclip/io_adapters/abstract_adapter_spec.rb +160 -0
- data/spec/paperclip/io_adapters/attachment_adapter_spec.rb +140 -0
- data/spec/paperclip/io_adapters/data_uri_adapter_spec.rb +88 -0
- data/spec/paperclip/io_adapters/empty_string_adapter_spec.rb +17 -0
- data/spec/paperclip/io_adapters/file_adapter_spec.rb +131 -0
- data/spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb +137 -0
- data/spec/paperclip/io_adapters/identity_adapter_spec.rb +8 -0
- data/spec/paperclip/io_adapters/nil_adapter_spec.rb +25 -0
- data/spec/paperclip/io_adapters/registry_spec.rb +35 -0
- data/spec/paperclip/io_adapters/stringio_adapter_spec.rb +64 -0
- data/spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb +146 -0
- data/spec/paperclip/io_adapters/uri_adapter_spec.rb +221 -0
- data/spec/paperclip/matchers/have_attached_file_matcher_spec.rb +19 -0
- data/spec/paperclip/matchers/validate_attachment_content_type_matcher_spec.rb +108 -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 +120 -0
- data/spec/paperclip/meta_class_spec.rb +30 -0
- data/spec/paperclip/paperclip_missing_attachment_styles_spec.rb +88 -0
- data/spec/paperclip/paperclip_spec.rb +196 -0
- data/spec/paperclip/plural_cache_spec.rb +37 -0
- data/spec/paperclip/processor_helpers_spec.rb +57 -0
- data/spec/paperclip/processor_spec.rb +26 -0
- data/spec/paperclip/rails_environment_spec.rb +30 -0
- data/spec/paperclip/rake_spec.rb +103 -0
- data/spec/paperclip/schema_spec.rb +252 -0
- data/spec/paperclip/storage/filesystem_spec.rb +79 -0
- data/spec/paperclip/storage/fog_spec.rb +560 -0
- data/spec/paperclip/storage/s3_live_spec.rb +188 -0
- data/spec/paperclip/storage/s3_spec.rb +1695 -0
- data/spec/paperclip/style_spec.rb +251 -0
- data/spec/paperclip/tempfile_factory_spec.rb +33 -0
- data/spec/paperclip/tempfile_spec.rb +35 -0
- data/spec/paperclip/thumbnail_spec.rb +504 -0
- data/spec/paperclip/url_generator_spec.rb +221 -0
- data/spec/paperclip/validators/attachment_content_type_validator_spec.rb +322 -0
- data/spec/paperclip/validators/attachment_file_name_validator_spec.rb +159 -0
- data/spec/paperclip/validators/attachment_presence_validator_spec.rb +85 -0
- data/spec/paperclip/validators/attachment_size_validator_spec.rb +235 -0
- data/spec/paperclip/validators/media_type_spoof_detection_validator_spec.rb +48 -0
- data/spec/paperclip/validators_spec.rb +164 -0
- data/spec/spec_helper.rb +45 -0
- data/spec/support/assertions.rb +84 -0
- data/spec/support/fake_model.rb +24 -0
- data/spec/support/fake_rails.rb +12 -0
- data/spec/support/fixtures/12k.png +0 -0
- data/spec/support/fixtures/50x50.png +0 -0
- data/spec/support/fixtures/5k.png +0 -0
- data/spec/support/fixtures/animated +0 -0
- data/spec/support/fixtures/animated.gif +0 -0
- data/spec/support/fixtures/animated.unknown +0 -0
- data/spec/support/fixtures/bad.png +1 -0
- data/spec/support/fixtures/empty.html +1 -0
- data/spec/support/fixtures/empty.xlsx +0 -0
- data/spec/support/fixtures/fog.yml +8 -0
- data/spec/support/fixtures/rotated.jpg +0 -0
- data/spec/support/fixtures/s3.yml +8 -0
- data/spec/support/fixtures/spaced file.jpg +0 -0
- data/spec/support/fixtures/spaced file.png +0 -0
- data/spec/support/fixtures/text.txt +1 -0
- data/spec/support/fixtures/twopage.pdf +0 -0
- data/spec/support/fixtures/uppercase.PNG +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/mock_attachment.rb +24 -0
- data/spec/support/mock_interpolator.rb +24 -0
- data/spec/support/mock_url_generator_builder.rb +26 -0
- data/spec/support/model_reconstruction.rb +72 -0
- data/spec/support/reporting.rb +11 -0
- data/spec/support/test_data.rb +13 -0
- data/spec/support/version_helper.rb +9 -0
- metadata +586 -0
@@ -0,0 +1,88 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Paperclip::DataUriAdapter do
|
4
|
+
before do
|
5
|
+
Paperclip::DataUriAdapter.register
|
6
|
+
end
|
7
|
+
|
8
|
+
after do
|
9
|
+
Paperclip.io_adapters.unregister(described_class)
|
10
|
+
|
11
|
+
if @subject
|
12
|
+
@subject.close
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it "allows a missing mime-type" do
|
17
|
+
adapter = Paperclip.io_adapters.for("data:;base64,#{original_base64_content}")
|
18
|
+
assert_equal Paperclip::DataUriAdapter, adapter.class
|
19
|
+
end
|
20
|
+
|
21
|
+
it "alows mime type that has dot in it" do
|
22
|
+
adapter = Paperclip.io_adapters.for("data:image/vnd.microsoft.icon;base64,#{original_base64_content}")
|
23
|
+
assert_equal Paperclip::DataUriAdapter, adapter.class
|
24
|
+
end
|
25
|
+
|
26
|
+
context "a new instance" do
|
27
|
+
before do
|
28
|
+
@contents = "data:image/png;base64,#{original_base64_content}"
|
29
|
+
@subject = Paperclip.io_adapters.for(@contents, hash_digest: Digest::MD5)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "returns a nondescript file name" do
|
33
|
+
assert_equal "data", @subject.original_filename
|
34
|
+
end
|
35
|
+
|
36
|
+
it "returns a content type" do
|
37
|
+
assert_equal "image/png", @subject.content_type
|
38
|
+
end
|
39
|
+
|
40
|
+
it "returns the size of the data" do
|
41
|
+
assert_equal 4456, @subject.size
|
42
|
+
end
|
43
|
+
|
44
|
+
it "generates a correct MD5 hash of the contents" do
|
45
|
+
assert_equal(
|
46
|
+
Digest::MD5.hexdigest(Base64.decode64(original_base64_content)),
|
47
|
+
@subject.fingerprint
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "generates correct fingerprint after read" do
|
52
|
+
fingerprint = Digest::MD5.hexdigest(@subject.read)
|
53
|
+
assert_equal fingerprint, @subject.fingerprint
|
54
|
+
end
|
55
|
+
|
56
|
+
it "generates same fingerprint" do
|
57
|
+
assert_equal @subject.fingerprint, @subject.fingerprint
|
58
|
+
end
|
59
|
+
|
60
|
+
it "accepts a content_type" do
|
61
|
+
@subject.content_type = "image/png"
|
62
|
+
assert_equal "image/png", @subject.content_type
|
63
|
+
end
|
64
|
+
|
65
|
+
it "accepts an original_filename" do
|
66
|
+
@subject.original_filename = "image.png"
|
67
|
+
assert_equal "image.png", @subject.original_filename
|
68
|
+
end
|
69
|
+
|
70
|
+
it "does not generate filenames that include restricted characters" do
|
71
|
+
@subject.original_filename = "image:restricted.png"
|
72
|
+
assert_equal "image_restricted.png", @subject.original_filename
|
73
|
+
end
|
74
|
+
|
75
|
+
it "does not generate paths that include restricted characters" do
|
76
|
+
@subject.original_filename = "image:restricted.png"
|
77
|
+
expect(@subject.path).to_not match(/:/)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def original_base64_content
|
82
|
+
Base64.encode64(original_file_contents)
|
83
|
+
end
|
84
|
+
|
85
|
+
def original_file_contents
|
86
|
+
@original_file_contents ||= File.read(fixture_file("5k.png"))
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Paperclip::EmptyStringAdapter do
|
4
|
+
context "a new instance" do
|
5
|
+
before do
|
6
|
+
@subject = Paperclip.io_adapters.for("")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "returns false for a call to nil?" do
|
10
|
+
assert !@subject.nil?
|
11
|
+
end
|
12
|
+
|
13
|
+
it "returns false for a call to assignment?" do
|
14
|
+
assert !@subject.assignment?
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Paperclip::FileAdapter do
|
4
|
+
context "a new instance" do
|
5
|
+
context "with normal file" do
|
6
|
+
before do
|
7
|
+
@file = File.new(fixture_file("5k.png"))
|
8
|
+
@file.binmode
|
9
|
+
end
|
10
|
+
|
11
|
+
after do
|
12
|
+
@file.close
|
13
|
+
@subject.close if @subject
|
14
|
+
end
|
15
|
+
|
16
|
+
context "doing normal things" do
|
17
|
+
before do
|
18
|
+
@subject = Paperclip.io_adapters.for(@file, hash_digest: Digest::MD5)
|
19
|
+
end
|
20
|
+
|
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
|
26
|
+
assert_equal "5k.png", @subject.original_filename
|
27
|
+
end
|
28
|
+
|
29
|
+
it "forces binmode on tempfile" do
|
30
|
+
assert @subject.instance_variable_get("@tempfile").binmode?
|
31
|
+
end
|
32
|
+
|
33
|
+
it "gets the content type" do
|
34
|
+
assert_equal "image/png", @subject.content_type
|
35
|
+
end
|
36
|
+
|
37
|
+
it "returns content type as a string" do
|
38
|
+
expect(@subject.content_type).to be_a String
|
39
|
+
end
|
40
|
+
|
41
|
+
it "gets the file's size" do
|
42
|
+
assert_equal 4456, @subject.size
|
43
|
+
end
|
44
|
+
|
45
|
+
it "returns false for a call to nil?" do
|
46
|
+
assert !@subject.nil?
|
47
|
+
end
|
48
|
+
|
49
|
+
it "generates a MD5 hash of the contents" do
|
50
|
+
expected = Digest::MD5.file(@file.path).to_s
|
51
|
+
assert_equal expected, @subject.fingerprint
|
52
|
+
end
|
53
|
+
|
54
|
+
it "reads the contents of the file" do
|
55
|
+
expected = @file.read
|
56
|
+
assert !expected.empty?
|
57
|
+
assert_equal expected, @subject.read
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "file with multiple possible content type" do
|
62
|
+
before do
|
63
|
+
allow(MIME::Types).to receive(:type_for).and_return([MIME::Type.new("image/x-png"), MIME::Type.new("image/png")])
|
64
|
+
@subject = Paperclip.io_adapters.for(@file, hash_digest: Digest::MD5)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "prefers officially registered mime type" do
|
68
|
+
assert_equal "image/png", @subject.content_type
|
69
|
+
end
|
70
|
+
|
71
|
+
it "returns content type as a string" do
|
72
|
+
expect(@subject.content_type).to be_a String
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context "file with content type derived from file contents on *nix" do
|
77
|
+
before do
|
78
|
+
allow(MIME::Types).to receive(:type_for).and_return([])
|
79
|
+
allow(Paperclip).to receive(:run).and_return("application/vnd.ms-office\n")
|
80
|
+
allow_any_instance_of(Paperclip::ContentTypeDetector).
|
81
|
+
to receive(:type_from_mime_magic).and_return("application/vnd.ms-office")
|
82
|
+
|
83
|
+
@subject = Paperclip.io_adapters.for(@file)
|
84
|
+
end
|
85
|
+
|
86
|
+
it "returns content type without newline character" do
|
87
|
+
assert_equal "application/vnd.ms-office", @subject.content_type
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context "filename with restricted characters" do
|
93
|
+
before do
|
94
|
+
@file = File.open(fixture_file("animated.gif")) do |file|
|
95
|
+
StringIO.new(file.read)
|
96
|
+
end
|
97
|
+
allow(@file).to receive(:original_filename).and_return("image:restricted.gif")
|
98
|
+
@subject = Paperclip.io_adapters.for(@file)
|
99
|
+
end
|
100
|
+
|
101
|
+
after do
|
102
|
+
@file.close
|
103
|
+
@subject.close
|
104
|
+
end
|
105
|
+
|
106
|
+
it "does not generate filenames that include restricted characters" do
|
107
|
+
assert_equal "image_restricted.gif", @subject.original_filename
|
108
|
+
end
|
109
|
+
|
110
|
+
it "does not generate paths that include restricted characters" do
|
111
|
+
expect(@subject.path).to_not match(/:/)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context "empty file" do
|
116
|
+
before do
|
117
|
+
@file = Tempfile.new("file_adapter_test")
|
118
|
+
@subject = Paperclip.io_adapters.for(@file)
|
119
|
+
end
|
120
|
+
|
121
|
+
after do
|
122
|
+
@file.close
|
123
|
+
@subject.close
|
124
|
+
end
|
125
|
+
|
126
|
+
it "provides correct mime-type" do
|
127
|
+
assert_match %r{.*/x-empty}, @subject.content_type
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Paperclip::HttpUrlProxyAdapter do
|
4
|
+
before do
|
5
|
+
@open_return = StringIO.new("xxx")
|
6
|
+
allow(@open_return).to receive(:meta).and_return("content-type" => "image/png")
|
7
|
+
allow_any_instance_of(Paperclip::HttpUrlProxyAdapter).to receive(:download_content).
|
8
|
+
and_return(@open_return)
|
9
|
+
Paperclip::HttpUrlProxyAdapter.register
|
10
|
+
end
|
11
|
+
|
12
|
+
after do
|
13
|
+
Paperclip.io_adapters.unregister(described_class)
|
14
|
+
end
|
15
|
+
|
16
|
+
context "a new instance" do
|
17
|
+
before do
|
18
|
+
@url = "http://thoughtbot.com/images/thoughtbot-logo.png"
|
19
|
+
@subject = Paperclip.io_adapters.for(@url, hash_digest: Digest::MD5)
|
20
|
+
end
|
21
|
+
|
22
|
+
after do
|
23
|
+
@subject.close
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns a file name" do
|
27
|
+
assert_equal "thoughtbot-logo.png", @subject.original_filename
|
28
|
+
end
|
29
|
+
|
30
|
+
it "closes open handle after reading" do
|
31
|
+
assert_equal true, @open_return.closed?
|
32
|
+
end
|
33
|
+
|
34
|
+
it "returns a content type" do
|
35
|
+
assert_equal "image/png", @subject.content_type
|
36
|
+
end
|
37
|
+
|
38
|
+
it "returns the size of the data" do
|
39
|
+
assert_equal @open_return.size, @subject.size
|
40
|
+
end
|
41
|
+
|
42
|
+
it "generates an MD5 hash of the contents" do
|
43
|
+
assert_equal Digest::MD5.hexdigest("xxx"), @subject.fingerprint
|
44
|
+
end
|
45
|
+
|
46
|
+
it "generates correct fingerprint after read" do
|
47
|
+
fingerprint = Digest::MD5.hexdigest(@subject.read)
|
48
|
+
assert_equal fingerprint, @subject.fingerprint
|
49
|
+
end
|
50
|
+
|
51
|
+
it "generates same fingerprint" do
|
52
|
+
assert_equal @subject.fingerprint, @subject.fingerprint
|
53
|
+
end
|
54
|
+
|
55
|
+
it "returns the data contained in the StringIO" do
|
56
|
+
assert_equal "xxx", @subject.read
|
57
|
+
end
|
58
|
+
|
59
|
+
it "accepts a content_type" do
|
60
|
+
@subject.content_type = "image/png"
|
61
|
+
assert_equal "image/png", @subject.content_type
|
62
|
+
end
|
63
|
+
|
64
|
+
it "accepts an original_filename" do
|
65
|
+
@subject.original_filename = "image.png"
|
66
|
+
assert_equal "image.png", @subject.original_filename
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "a url with query params" do
|
71
|
+
subject { Paperclip.io_adapters.for(url) }
|
72
|
+
|
73
|
+
after { subject.close }
|
74
|
+
|
75
|
+
let(:url) { "https://github.com/thoughtbot/paperclip?file=test" }
|
76
|
+
|
77
|
+
it "returns a file name" do
|
78
|
+
assert_equal "paperclip", subject.original_filename
|
79
|
+
end
|
80
|
+
|
81
|
+
it "preserves params" do
|
82
|
+
assert_equal url, subject.instance_variable_get(:@target).to_s
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context "a url with restricted characters in the filename" do
|
87
|
+
before do
|
88
|
+
@url = "https://github.com/thoughtbot/paper:clip.jpg"
|
89
|
+
@subject = Paperclip.io_adapters.for(@url)
|
90
|
+
end
|
91
|
+
|
92
|
+
after do
|
93
|
+
begin
|
94
|
+
@subject.close
|
95
|
+
rescue Exception
|
96
|
+
true
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
it "does not generate filenames that include restricted characters" do
|
101
|
+
assert_equal "paper_clip.jpg", @subject.original_filename
|
102
|
+
end
|
103
|
+
|
104
|
+
it "does not generate paths that include restricted characters" do
|
105
|
+
expect(@subject.path).to_not match(/:/)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context "a url with special characters in the filename" do
|
110
|
+
before do
|
111
|
+
allow_any_instance_of(Paperclip::HttpUrlProxyAdapter).to receive(:download_content).and_return(@open_return)
|
112
|
+
end
|
113
|
+
|
114
|
+
let(:filename) do
|
115
|
+
"paperclip-%C3%B6%C3%A4%C3%BC%E5%AD%97%C2%B4%C2%BD%E2%99%A5"\
|
116
|
+
"%C3%98%C2%B2%C3%88.png"
|
117
|
+
end
|
118
|
+
let(:url) { "https://github.com/thoughtbot/paperclip-öäü字´½♥زÈ.png" }
|
119
|
+
|
120
|
+
subject { Paperclip.io_adapters.for(url) }
|
121
|
+
|
122
|
+
it "returns a encoded filename" do
|
123
|
+
assert_equal filename, subject.original_filename
|
124
|
+
end
|
125
|
+
|
126
|
+
context "when already URI encoded" do
|
127
|
+
let(:url) do
|
128
|
+
"https://github.com/thoughtbot/paperclip-%C3%B6%C3%A4%C3%BC%E5%AD%97"\
|
129
|
+
"%C2%B4%C2%BD%E2%99%A5%C3%98%C2%B2%C3%88.png"
|
130
|
+
end
|
131
|
+
|
132
|
+
it "returns a encoded filename" do
|
133
|
+
assert_equal filename, subject.original_filename
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Paperclip::NilAdapter do
|
4
|
+
context "a new instance" do
|
5
|
+
before do
|
6
|
+
@subject = Paperclip.io_adapters.for(nil)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "gets the right filename" do
|
10
|
+
assert_equal "", @subject.original_filename
|
11
|
+
end
|
12
|
+
|
13
|
+
it "gets the content type" do
|
14
|
+
assert_equal "", @subject.content_type
|
15
|
+
end
|
16
|
+
|
17
|
+
it "gets the file's size" do
|
18
|
+
assert_equal 0, @subject.size
|
19
|
+
end
|
20
|
+
|
21
|
+
it "returns true for a call to nil?" do
|
22
|
+
assert @subject.nil?
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Paperclip::AttachmentRegistry do
|
4
|
+
context "for" do
|
5
|
+
before do
|
6
|
+
class AdapterTest
|
7
|
+
def initialize(_target, _ = {}); end
|
8
|
+
end
|
9
|
+
@subject = Paperclip::AdapterRegistry.new
|
10
|
+
@subject.register(AdapterTest) { |t| Symbol === t }
|
11
|
+
end
|
12
|
+
|
13
|
+
it "returns the class registered for the adapted type" do
|
14
|
+
assert_equal AdapterTest, @subject.for(:target).class
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "registered?" do
|
19
|
+
before do
|
20
|
+
class AdapterTest
|
21
|
+
def initialize(_target, _ = {}); end
|
22
|
+
end
|
23
|
+
@subject = Paperclip::AdapterRegistry.new
|
24
|
+
@subject.register(AdapterTest) { |t| Symbol === t }
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns true when the class of this adapter has been registered" do
|
28
|
+
assert @subject.registered?(AdapterTest.new(:target))
|
29
|
+
end
|
30
|
+
|
31
|
+
it "returns false when the adapter has not been registered" do
|
32
|
+
assert !@subject.registered?(Object)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|