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
@@ -1,7 +1,7 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
describe Paperclip::Interpolations do
|
4
|
+
it "returns all methods but the infrastructure when sent #all" do
|
5
5
|
methods = Paperclip::Interpolations.all
|
6
6
|
assert ! methods.include?(:[])
|
7
7
|
assert ! methods.include?(:[]=)
|
@@ -11,58 +11,59 @@ class InterpolationsTest < Test::Unit::TestCase
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
it "returns the Rails.root" do
|
15
15
|
assert_equal Rails.root, Paperclip::Interpolations.rails_root(:attachment, :style)
|
16
16
|
end
|
17
17
|
|
18
|
-
|
18
|
+
it "returns the Rails.env" do
|
19
19
|
assert_equal Rails.env, Paperclip::Interpolations.rails_env(:attachment, :style)
|
20
20
|
end
|
21
21
|
|
22
|
-
|
22
|
+
it "returns the class of the Interpolations module when called with no params" do
|
23
23
|
assert_equal Module, Paperclip::Interpolations.class
|
24
24
|
end
|
25
25
|
|
26
|
-
|
26
|
+
it "returns the class of the instance" do
|
27
|
+
class Thing ; end
|
27
28
|
attachment = mock
|
28
29
|
attachment.expects(:instance).returns(attachment)
|
29
|
-
attachment.expects(:class).returns(
|
30
|
+
attachment.expects(:class).returns(Thing)
|
30
31
|
assert_equal "things", Paperclip::Interpolations.class(attachment, :style)
|
31
32
|
end
|
32
33
|
|
33
|
-
|
34
|
+
it "returns the basename of the file" do
|
34
35
|
attachment = mock
|
35
|
-
attachment.expects(:original_filename).returns("one.jpg").times(
|
36
|
+
attachment.expects(:original_filename).returns("one.jpg").times(1)
|
36
37
|
assert_equal "one", Paperclip::Interpolations.basename(attachment, :style)
|
37
38
|
end
|
38
39
|
|
39
|
-
|
40
|
+
it "returns the extension of the file" do
|
40
41
|
attachment = mock
|
41
42
|
attachment.expects(:original_filename).returns("one.jpg")
|
42
43
|
attachment.expects(:styles).returns({})
|
43
44
|
assert_equal "jpg", Paperclip::Interpolations.extension(attachment, :style)
|
44
45
|
end
|
45
46
|
|
46
|
-
|
47
|
+
it "returns the extension of the file as the format if defined in the style" do
|
47
48
|
attachment = mock
|
48
49
|
attachment.expects(:original_filename).never
|
49
|
-
attachment.expects(:styles).twice.returns({:
|
50
|
+
attachment.expects(:styles).twice.returns({style: {format: "png"}})
|
50
51
|
|
51
52
|
[:style, 'style'].each do |style|
|
52
53
|
assert_equal "png", Paperclip::Interpolations.extension(attachment, style)
|
53
54
|
end
|
54
55
|
end
|
55
56
|
|
56
|
-
|
57
|
+
it "returns the extension of the file based on the content type" do
|
57
58
|
attachment = mock
|
58
|
-
attachment.expects(:content_type).returns('image/
|
59
|
+
attachment.expects(:content_type).returns('image/png')
|
59
60
|
attachment.expects(:styles).returns({})
|
60
61
|
interpolations = Paperclip::Interpolations
|
61
62
|
interpolations.expects(:extension).returns('random')
|
62
|
-
assert_equal "
|
63
|
+
assert_equal "png", interpolations.content_type_extension(attachment, :style)
|
63
64
|
end
|
64
65
|
|
65
|
-
|
66
|
+
it "returns the original extension of the file if it matches a content type extension" do
|
66
67
|
attachment = mock
|
67
68
|
attachment.expects(:content_type).returns('image/jpeg')
|
68
69
|
attachment.expects(:styles).returns({})
|
@@ -71,7 +72,21 @@ class InterpolationsTest < Test::Unit::TestCase
|
|
71
72
|
assert_equal "jpe", interpolations.content_type_extension(attachment, :style)
|
72
73
|
end
|
73
74
|
|
74
|
-
|
75
|
+
it "returns the extension of the file with a dot" do
|
76
|
+
attachment = mock
|
77
|
+
attachment.expects(:original_filename).returns("one.jpg")
|
78
|
+
attachment.expects(:styles).returns({})
|
79
|
+
assert_equal ".jpg", Paperclip::Interpolations.dotextension(attachment, :style)
|
80
|
+
end
|
81
|
+
|
82
|
+
it "returns the extension of the file without a dot if the extension is empty" do
|
83
|
+
attachment = mock
|
84
|
+
attachment.expects(:original_filename).returns("one")
|
85
|
+
attachment.expects(:styles).returns({})
|
86
|
+
assert_equal "", Paperclip::Interpolations.dotextension(attachment, :style)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "returns the latter half of the content type of the extension if no match found" do
|
75
90
|
attachment = mock
|
76
91
|
attachment.expects(:content_type).at_least_once().returns('not/found')
|
77
92
|
attachment.expects(:styles).returns({})
|
@@ -80,87 +95,87 @@ class InterpolationsTest < Test::Unit::TestCase
|
|
80
95
|
assert_equal "found", interpolations.content_type_extension(attachment, :style)
|
81
96
|
end
|
82
97
|
|
83
|
-
|
98
|
+
it "returns the format if defined in the style, ignoring the content type" do
|
84
99
|
attachment = mock
|
85
100
|
attachment.expects(:content_type).returns('image/jpeg')
|
86
|
-
attachment.expects(:styles).returns({:
|
101
|
+
attachment.expects(:styles).returns({style: {format: "png"}})
|
87
102
|
interpolations = Paperclip::Interpolations
|
88
103
|
interpolations.expects(:extension).returns('random')
|
89
104
|
assert_equal "png", interpolations.content_type_extension(attachment, :style)
|
90
105
|
end
|
91
106
|
|
92
|
-
|
107
|
+
it "is able to handle numeric style names" do
|
93
108
|
attachment = mock(
|
94
|
-
:
|
109
|
+
styles: {:"4" => {format: :expected_extension}}
|
95
110
|
)
|
96
111
|
assert_equal :expected_extension, Paperclip::Interpolations.extension(attachment, 4)
|
97
112
|
end
|
98
113
|
|
99
|
-
|
114
|
+
it "returns the #to_param of the attachment" do
|
100
115
|
attachment = mock
|
101
116
|
attachment.expects(:to_param).returns("23-awesome")
|
102
117
|
attachment.expects(:instance).returns(attachment)
|
103
118
|
assert_equal "23-awesome", Paperclip::Interpolations.param(attachment, :style)
|
104
119
|
end
|
105
120
|
|
106
|
-
|
121
|
+
it "returns the id of the attachment" do
|
107
122
|
attachment = mock
|
108
123
|
attachment.expects(:id).returns(23)
|
109
124
|
attachment.expects(:instance).returns(attachment)
|
110
125
|
assert_equal 23, Paperclip::Interpolations.id(attachment, :style)
|
111
126
|
end
|
112
127
|
|
113
|
-
|
128
|
+
it "returns nil for attachments to new records" do
|
114
129
|
attachment = mock
|
115
130
|
attachment.expects(:id).returns(nil)
|
116
131
|
attachment.expects(:instance).returns(attachment)
|
117
132
|
assert_nil Paperclip::Interpolations.id(attachment, :style)
|
118
133
|
end
|
119
134
|
|
120
|
-
|
135
|
+
it "returns the partitioned id of the attachment when the id is an integer" do
|
121
136
|
attachment = mock
|
122
137
|
attachment.expects(:id).returns(23)
|
123
138
|
attachment.expects(:instance).returns(attachment)
|
124
139
|
assert_equal "000/000/023", Paperclip::Interpolations.id_partition(attachment, :style)
|
125
140
|
end
|
126
141
|
|
127
|
-
|
142
|
+
it "returns the partitioned id of the attachment when the id is a string" do
|
128
143
|
attachment = mock
|
129
144
|
attachment.expects(:id).returns("32fnj23oio2f")
|
130
145
|
attachment.expects(:instance).returns(attachment)
|
131
146
|
assert_equal "32f/nj2/3oi", Paperclip::Interpolations.id_partition(attachment, :style)
|
132
147
|
end
|
133
148
|
|
134
|
-
|
149
|
+
it "returns nil for the partitioned id of an attachment to a new record (when the id is nil)" do
|
135
150
|
attachment = mock
|
136
151
|
attachment.expects(:id).returns(nil)
|
137
152
|
attachment.expects(:instance).returns(attachment)
|
138
153
|
assert_nil Paperclip::Interpolations.id_partition(attachment, :style)
|
139
154
|
end
|
140
155
|
|
141
|
-
|
156
|
+
it "returns the name of the attachment" do
|
142
157
|
attachment = mock
|
143
158
|
attachment.expects(:name).returns("file")
|
144
159
|
assert_equal "files", Paperclip::Interpolations.attachment(attachment, :style)
|
145
160
|
end
|
146
161
|
|
147
|
-
|
162
|
+
it "returns the style" do
|
148
163
|
assert_equal :style, Paperclip::Interpolations.style(:attachment, :style)
|
149
164
|
end
|
150
165
|
|
151
|
-
|
166
|
+
it "returns the default style" do
|
152
167
|
attachment = mock
|
153
168
|
attachment.expects(:default_style).returns(:default_style)
|
154
169
|
assert_equal :default_style, Paperclip::Interpolations.style(attachment, nil)
|
155
170
|
end
|
156
171
|
|
157
|
-
|
172
|
+
it "reinterpolates :url" do
|
158
173
|
attachment = mock
|
159
|
-
attachment.expects(:url).with(:style, :
|
174
|
+
attachment.expects(:url).with(:style, timestamp: false, escape: false).returns("1234")
|
160
175
|
assert_equal "1234", Paperclip::Interpolations.url(attachment, :style)
|
161
176
|
end
|
162
177
|
|
163
|
-
|
178
|
+
it "raises if infinite loop detcted reinterpolating :url" do
|
164
179
|
attachment = Object.new
|
165
180
|
class << attachment
|
166
181
|
def url(*args)
|
@@ -170,35 +185,35 @@ class InterpolationsTest < Test::Unit::TestCase
|
|
170
185
|
assert_raises(Paperclip::Errors::InfiniteInterpolationError){ Paperclip::Interpolations.url(attachment, :style) }
|
171
186
|
end
|
172
187
|
|
173
|
-
|
188
|
+
it "returns the filename as basename.extension" do
|
174
189
|
attachment = mock
|
175
190
|
attachment.expects(:styles).returns({})
|
176
|
-
attachment.expects(:original_filename).returns("one.jpg").times(
|
191
|
+
attachment.expects(:original_filename).returns("one.jpg").times(2)
|
177
192
|
assert_equal "one.jpg", Paperclip::Interpolations.filename(attachment, :style)
|
178
193
|
end
|
179
194
|
|
180
|
-
|
195
|
+
it "returns the filename as basename.extension when format supplied" do
|
181
196
|
attachment = mock
|
182
|
-
attachment.expects(:styles).returns({:
|
183
|
-
attachment.expects(:original_filename).returns("one.jpg").times(
|
197
|
+
attachment.expects(:styles).returns({style: {format: :png}})
|
198
|
+
attachment.expects(:original_filename).returns("one.jpg").times(1)
|
184
199
|
assert_equal "one.png", Paperclip::Interpolations.filename(attachment, :style)
|
185
200
|
end
|
186
201
|
|
187
|
-
|
202
|
+
it "returns the filename as basename when extension is blank" do
|
188
203
|
attachment = mock
|
189
204
|
attachment.stubs(:styles).returns({})
|
190
205
|
attachment.stubs(:original_filename).returns("one")
|
191
206
|
assert_equal "one", Paperclip::Interpolations.filename(attachment, :style)
|
192
207
|
end
|
193
208
|
|
194
|
-
|
209
|
+
it "returns the basename when the extension contains regexp special characters" do
|
195
210
|
attachment = mock
|
196
211
|
attachment.stubs(:styles).returns({})
|
197
212
|
attachment.stubs(:original_filename).returns("one.ab)")
|
198
213
|
assert_equal "one", Paperclip::Interpolations.basename(attachment, :style)
|
199
214
|
end
|
200
215
|
|
201
|
-
|
216
|
+
it "returns the timestamp" do
|
202
217
|
now = Time.now
|
203
218
|
zone = 'UTC'
|
204
219
|
attachment = mock
|
@@ -207,32 +222,41 @@ class InterpolationsTest < Test::Unit::TestCase
|
|
207
222
|
assert_equal now.in_time_zone(zone).to_s, Paperclip::Interpolations.timestamp(attachment, :style)
|
208
223
|
end
|
209
224
|
|
210
|
-
|
225
|
+
it "returns updated_at" do
|
211
226
|
attachment = mock
|
212
227
|
seconds_since_epoch = 1234567890
|
213
228
|
attachment.expects(:updated_at).returns(seconds_since_epoch)
|
214
229
|
assert_equal seconds_since_epoch, Paperclip::Interpolations.updated_at(attachment, :style)
|
215
230
|
end
|
216
231
|
|
217
|
-
|
232
|
+
it "returns attachment's hash when passing both arguments" do
|
218
233
|
attachment = mock
|
219
234
|
fake_hash = "a_wicked_secure_hash"
|
220
235
|
attachment.expects(:hash_key).returns(fake_hash)
|
221
236
|
assert_equal fake_hash, Paperclip::Interpolations.hash(attachment, :style)
|
222
237
|
end
|
223
238
|
|
224
|
-
|
239
|
+
it "returns Object#hash when passing no argument" do
|
225
240
|
attachment = mock
|
226
241
|
fake_hash = "a_wicked_secure_hash"
|
227
242
|
attachment.expects(:hash_key).never.returns(fake_hash)
|
228
243
|
assert_not_equal fake_hash, Paperclip::Interpolations.hash
|
229
244
|
end
|
230
245
|
|
231
|
-
|
246
|
+
it "calls all expected interpolations with the given arguments" do
|
232
247
|
Paperclip::Interpolations.expects(:id).with(:attachment, :style).returns(1234)
|
233
248
|
Paperclip::Interpolations.expects(:attachment).with(:attachment, :style).returns("attachments")
|
234
249
|
Paperclip::Interpolations.expects(:notreal).never
|
235
250
|
value = Paperclip::Interpolations.interpolate(":notreal/:id/:attachment", :attachment, :style)
|
236
251
|
assert_equal ":notreal/1234/attachments", value
|
237
252
|
end
|
253
|
+
|
254
|
+
it "handles question marks" do
|
255
|
+
Paperclip.interpolates :foo? do
|
256
|
+
"bar"
|
257
|
+
end
|
258
|
+
Paperclip::Interpolations.expects(:fool).never
|
259
|
+
value = Paperclip::Interpolations.interpolate(":fo/:foo?")
|
260
|
+
assert_equal ":fo/bar", value
|
261
|
+
end
|
238
262
|
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Paperclip::AbstractAdapter do
|
4
|
+
class TestAdapter < Paperclip::AbstractAdapter
|
5
|
+
attr_accessor :tempfile
|
6
|
+
|
7
|
+
def content_type
|
8
|
+
Paperclip::ContentTypeDetector.new(path).detect
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
context "content type from file contents" do
|
13
|
+
before do
|
14
|
+
@adapter = TestAdapter.new
|
15
|
+
@adapter.stubs(:path).returns("image.png")
|
16
|
+
Paperclip.stubs(:run).returns("image/png\n")
|
17
|
+
Paperclip::ContentTypeDetector.any_instance.stubs(:type_from_mime_magic).returns("image/png")
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns the content type without newline" do
|
21
|
+
assert_equal "image/png", @adapter.content_type
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "nil?" do
|
26
|
+
it "returns false" do
|
27
|
+
assert !TestAdapter.new.nil?
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "delegation" do
|
32
|
+
before do
|
33
|
+
@adapter = TestAdapter.new
|
34
|
+
@adapter.tempfile = stub("Tempfile")
|
35
|
+
end
|
36
|
+
|
37
|
+
[:binmode, :binmode?, :close, :close!, :closed?, :eof?, :path, :rewind, :unlink].each do |method|
|
38
|
+
it "delegates #{method} to @tempfile" do
|
39
|
+
@adapter.tempfile.stubs(method)
|
40
|
+
@adapter.public_send(method)
|
41
|
+
assert_received @adapter.tempfile, method
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'gets rid of slashes and colons in filenames' do
|
47
|
+
@adapter = TestAdapter.new
|
48
|
+
@adapter.original_filename = "awesome/file:name.png"
|
49
|
+
|
50
|
+
assert_equal "awesome_file_name.png", @adapter.original_filename
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'is an assignment' do
|
54
|
+
assert TestAdapter.new.assignment?
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'is not nil' do
|
58
|
+
assert !TestAdapter.new.nil?
|
59
|
+
end
|
60
|
+
|
61
|
+
it "generates a destination filename with no original filename" do
|
62
|
+
@adapter = TestAdapter.new
|
63
|
+
expect(@adapter.send(:destination).path).to_not be_nil
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'uses the original filename to generate the tempfile' do
|
67
|
+
@adapter = TestAdapter.new
|
68
|
+
@adapter.original_filename = "file.png"
|
69
|
+
expect(@adapter.send(:destination).path).to end_with(".png")
|
70
|
+
end
|
71
|
+
|
72
|
+
context "#original_filename=" do
|
73
|
+
it "should not fail with a nil original filename" do
|
74
|
+
adapter = TestAdapter.new
|
75
|
+
expect{ adapter.original_filename = nil }.not_to raise_error
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -1,15 +1,13 @@
|
|
1
|
-
require '
|
2
|
-
require 'pp'
|
1
|
+
require 'spec_helper'
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
rebuild_model :path => "tmp/:class/:attachment/:style/:filename", :styles => {:thumb => '50x50'}
|
3
|
+
describe Paperclip::AttachmentAdapter do
|
4
|
+
before do
|
5
|
+
rebuild_model path: "tmp/:class/:attachment/:style/:filename", styles: {thumb: '50x50'}
|
8
6
|
@attachment = Dummy.new.avatar
|
9
7
|
end
|
10
8
|
|
11
9
|
context "for an attachment" do
|
12
|
-
|
10
|
+
before do
|
13
11
|
@file = File.new(fixture_file("5k.png"))
|
14
12
|
@file.binmode
|
15
13
|
|
@@ -18,37 +16,37 @@ class AttachmentAdapterTest < Test::Unit::TestCase
|
|
18
16
|
@subject = Paperclip.io_adapters.for(@attachment)
|
19
17
|
end
|
20
18
|
|
21
|
-
|
19
|
+
after do
|
22
20
|
@file.close
|
23
21
|
@subject.close
|
24
22
|
end
|
25
23
|
|
26
|
-
|
24
|
+
it "gets the right filename" do
|
27
25
|
assert_equal "5k.png", @subject.original_filename
|
28
26
|
end
|
29
27
|
|
30
|
-
|
28
|
+
it "forces binmode on tempfile" do
|
31
29
|
assert @subject.instance_variable_get("@tempfile").binmode?
|
32
30
|
end
|
33
31
|
|
34
|
-
|
32
|
+
it "gets the content type" do
|
35
33
|
assert_equal "image/png", @subject.content_type
|
36
34
|
end
|
37
35
|
|
38
|
-
|
36
|
+
it "gets the file's size" do
|
39
37
|
assert_equal 4456, @subject.size
|
40
38
|
end
|
41
39
|
|
42
|
-
|
40
|
+
it "returns false for a call to nil?" do
|
43
41
|
assert ! @subject.nil?
|
44
42
|
end
|
45
43
|
|
46
|
-
|
44
|
+
it "generates a MD5 hash of the contents" do
|
47
45
|
expected = Digest::MD5.file(@file.path).to_s
|
48
46
|
assert_equal expected, @subject.fingerprint
|
49
47
|
end
|
50
48
|
|
51
|
-
|
49
|
+
it "reads the contents of the file" do
|
52
50
|
expected = @file.read
|
53
51
|
actual = @subject.read
|
54
52
|
assert expected.length > 0
|
@@ -59,7 +57,7 @@ class AttachmentAdapterTest < Test::Unit::TestCase
|
|
59
57
|
end
|
60
58
|
|
61
59
|
context "for a file with restricted characters in the name" do
|
62
|
-
|
60
|
+
before do
|
63
61
|
file_contents = IO.read(fixture_file("animated.gif"))
|
64
62
|
@file = StringIO.new(file_contents)
|
65
63
|
@file.stubs(:original_filename).returns('image:restricted.gif')
|
@@ -70,21 +68,21 @@ class AttachmentAdapterTest < Test::Unit::TestCase
|
|
70
68
|
@subject = Paperclip.io_adapters.for(@attachment)
|
71
69
|
end
|
72
70
|
|
73
|
-
|
71
|
+
after do
|
74
72
|
@subject.close
|
75
73
|
end
|
76
74
|
|
77
|
-
|
78
|
-
|
75
|
+
it "does not generate paths that include restricted characters" do
|
76
|
+
expect(@subject.path).to_not match(/:/)
|
79
77
|
end
|
80
78
|
|
81
|
-
|
79
|
+
it "does not generate filenames that include restricted characters" do
|
82
80
|
assert_equal 'image_restricted.gif', @subject.original_filename
|
83
81
|
end
|
84
82
|
end
|
85
83
|
|
86
84
|
context "for a style" do
|
87
|
-
|
85
|
+
before do
|
88
86
|
@file = File.new(fixture_file("5k.png"))
|
89
87
|
@file.binmode
|
90
88
|
|
@@ -97,38 +95,38 @@ class AttachmentAdapterTest < Test::Unit::TestCase
|
|
97
95
|
@subject = Paperclip.io_adapters.for(@attachment.styles[:thumb])
|
98
96
|
end
|
99
97
|
|
100
|
-
|
98
|
+
after do
|
101
99
|
@file.close
|
102
100
|
@thumb.close
|
103
101
|
@subject.close
|
104
102
|
end
|
105
103
|
|
106
|
-
|
104
|
+
it "gets the original filename" do
|
107
105
|
assert_equal "5k.png", @subject.original_filename
|
108
106
|
end
|
109
107
|
|
110
|
-
|
108
|
+
it "forces binmode on tempfile" do
|
111
109
|
assert @subject.instance_variable_get("@tempfile").binmode?
|
112
110
|
end
|
113
111
|
|
114
|
-
|
112
|
+
it "gets the content type" do
|
115
113
|
assert_equal "image/png", @subject.content_type
|
116
114
|
end
|
117
115
|
|
118
|
-
|
116
|
+
it "gets the thumbnail's file size" do
|
119
117
|
assert_equal @thumb.size, @subject.size
|
120
118
|
end
|
121
119
|
|
122
|
-
|
120
|
+
it "returns false for a call to nil?" do
|
123
121
|
assert ! @subject.nil?
|
124
122
|
end
|
125
123
|
|
126
|
-
|
124
|
+
it "generates a MD5 hash of the contents" do
|
127
125
|
expected = Digest::MD5.file(@thumb.path).to_s
|
128
126
|
assert_equal expected, @subject.fingerprint
|
129
127
|
end
|
130
128
|
|
131
|
-
|
129
|
+
it "reads the contents of the thumbnail" do
|
132
130
|
@thumb.rewind
|
133
131
|
expected = @thumb.read
|
134
132
|
actual = @subject.read
|
@@ -1,65 +1,74 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
def teardown
|
3
|
+
describe Paperclip::DataUriAdapter do
|
4
|
+
after do
|
6
5
|
if @subject
|
7
6
|
@subject.close
|
8
7
|
end
|
9
8
|
end
|
10
9
|
|
10
|
+
it 'allows a missing mime-type' do
|
11
|
+
adapter = Paperclip.io_adapters.for("data:;base64,#{original_base64_content}")
|
12
|
+
assert_equal Paperclip::DataUriAdapter, adapter.class
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'alows mime type that has dot in it' do
|
16
|
+
adapter = Paperclip.io_adapters.for("data:image/vnd.microsoft.icon;base64,#{original_base64_content}")
|
17
|
+
assert_equal Paperclip::DataUriAdapter, adapter.class
|
18
|
+
end
|
19
|
+
|
11
20
|
context "a new instance" do
|
12
|
-
|
21
|
+
before do
|
13
22
|
@contents = "data:image/png;base64,#{original_base64_content}"
|
14
23
|
@subject = Paperclip.io_adapters.for(@contents)
|
15
24
|
end
|
16
25
|
|
17
|
-
|
18
|
-
assert_equal "
|
26
|
+
it "returns a nondescript file name" do
|
27
|
+
assert_equal "data", @subject.original_filename
|
19
28
|
end
|
20
29
|
|
21
|
-
|
30
|
+
it "returns a content type" do
|
22
31
|
assert_equal "image/png", @subject.content_type
|
23
32
|
end
|
24
33
|
|
25
|
-
|
34
|
+
it "returns the size of the data" do
|
26
35
|
assert_equal 4456, @subject.size
|
27
36
|
end
|
28
37
|
|
29
|
-
|
38
|
+
it "generates a correct MD5 hash of the contents" do
|
30
39
|
assert_equal(
|
31
40
|
Digest::MD5.hexdigest(Base64.decode64(original_base64_content)),
|
32
41
|
@subject.fingerprint
|
33
42
|
)
|
34
43
|
end
|
35
44
|
|
36
|
-
|
45
|
+
it "generates correct fingerprint after read" do
|
37
46
|
fingerprint = Digest::MD5.hexdigest(@subject.read)
|
38
47
|
assert_equal fingerprint, @subject.fingerprint
|
39
48
|
end
|
40
49
|
|
41
|
-
|
50
|
+
it "generates same fingerprint" do
|
42
51
|
assert_equal @subject.fingerprint, @subject.fingerprint
|
43
52
|
end
|
44
53
|
|
45
|
-
|
54
|
+
it 'accepts a content_type' do
|
46
55
|
@subject.content_type = 'image/png'
|
47
56
|
assert_equal 'image/png', @subject.content_type
|
48
57
|
end
|
49
58
|
|
50
|
-
|
59
|
+
it 'accepts an original_filename' do
|
51
60
|
@subject.original_filename = 'image.png'
|
52
61
|
assert_equal 'image.png', @subject.original_filename
|
53
62
|
end
|
54
63
|
|
55
|
-
|
64
|
+
it "does not generate filenames that include restricted characters" do
|
56
65
|
@subject.original_filename = 'image:restricted.png'
|
57
66
|
assert_equal 'image_restricted.png', @subject.original_filename
|
58
67
|
end
|
59
68
|
|
60
|
-
|
69
|
+
it "does not generate paths that include restricted characters" do
|
61
70
|
@subject.original_filename = 'image:restricted.png'
|
62
|
-
|
71
|
+
expect(@subject.path).to_not match(/:/)
|
63
72
|
end
|
64
73
|
|
65
74
|
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
|