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,255 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Paperclip::Style do
|
5
|
+
context "A style rule" do
|
6
|
+
before do
|
7
|
+
@attachment = attachment path: ":basename.:extension",
|
8
|
+
styles: { foo: {geometry: "100x100#", format: :png} },
|
9
|
+
whiny: true
|
10
|
+
@style = @attachment.styles[:foo]
|
11
|
+
end
|
12
|
+
|
13
|
+
it "is held as a Style object" do
|
14
|
+
expect(@style).to be_a Paperclip::Style
|
15
|
+
end
|
16
|
+
|
17
|
+
it "gets processors from the attachment definition" do
|
18
|
+
assert_equal [:thumbnail], @style.processors
|
19
|
+
end
|
20
|
+
|
21
|
+
it "has the right geometry" do
|
22
|
+
assert_equal "100x100#", @style.geometry
|
23
|
+
end
|
24
|
+
|
25
|
+
it "is whiny if the attachment is" do
|
26
|
+
assert @style.whiny?
|
27
|
+
end
|
28
|
+
|
29
|
+
it "responds to hash notation" do
|
30
|
+
assert_equal [:thumbnail], @style[:processors]
|
31
|
+
assert_equal "100x100#", @style[:geometry]
|
32
|
+
end
|
33
|
+
|
34
|
+
it "returns the name of the style in processor options" do
|
35
|
+
assert_equal :foo, @style.processor_options[:style]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "A style rule with properties supplied as procs" do
|
40
|
+
before do
|
41
|
+
@attachment = attachment path: ":basename.:extension",
|
42
|
+
whiny_thumbnails: true,
|
43
|
+
processors: lambda {|a| [:test]},
|
44
|
+
styles: {
|
45
|
+
foo: lambda{|a| "300x300#"},
|
46
|
+
bar: {
|
47
|
+
geometry: lambda{|a| "300x300#"},
|
48
|
+
convert_options: lambda{|a| "-do_stuff"},
|
49
|
+
source_file_options: lambda{|a| "-do_extra_stuff"}
|
50
|
+
}
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
it "calls procs when they are needed" do
|
55
|
+
assert_equal "300x300#", @attachment.styles[:foo].geometry
|
56
|
+
assert_equal "300x300#", @attachment.styles[:bar].geometry
|
57
|
+
assert_equal [:test], @attachment.styles[:foo].processors
|
58
|
+
assert_equal [:test], @attachment.styles[:bar].processors
|
59
|
+
assert_equal "-do_stuff", @attachment.styles[:bar].convert_options
|
60
|
+
assert_equal "-do_extra_stuff", @attachment.styles[:bar].source_file_options
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "An attachment with style rules in various forms" do
|
65
|
+
before do
|
66
|
+
styles = {}
|
67
|
+
styles[:aslist] = ["100x100", :png]
|
68
|
+
styles[:ashash] = {geometry: "100x100", format: :png}
|
69
|
+
styles[:asstring] = "100x100"
|
70
|
+
@attachment = attachment path: ":basename.:extension",
|
71
|
+
styles: styles
|
72
|
+
end
|
73
|
+
|
74
|
+
it "has the right number of styles" do
|
75
|
+
expect(@attachment.styles).to be_a Hash
|
76
|
+
assert_equal 3, @attachment.styles.size
|
77
|
+
end
|
78
|
+
|
79
|
+
it "has styles as Style objects" do
|
80
|
+
[:aslist, :ashash, :aslist].each do |s|
|
81
|
+
expect(@attachment.styles[s]).to be_a Paperclip::Style
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
it "has the right geometries" do
|
86
|
+
[:aslist, :ashash, :aslist].each do |s|
|
87
|
+
assert_equal @attachment.styles[s].geometry, "100x100"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
it "has the right formats" do
|
92
|
+
assert_equal @attachment.styles[:aslist].format, :png
|
93
|
+
assert_equal @attachment.styles[:ashash].format, :png
|
94
|
+
assert_nil @attachment.styles[:asstring].format
|
95
|
+
end
|
96
|
+
|
97
|
+
it "retains order" do
|
98
|
+
assert_equal [:aslist, :ashash, :asstring], @attachment.styles.keys
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context "An attachment with :convert_options" do
|
103
|
+
it "does not have called extra_options_for(:thumb/:large) on initialization" do
|
104
|
+
@attachment = attachment path: ":basename.:extension",
|
105
|
+
styles: {thumb: "100x100", large: "400x400"},
|
106
|
+
convert_options: {all: "-do_stuff", thumb: "-thumbnailize"}
|
107
|
+
@attachment.expects(:extra_options_for).never
|
108
|
+
@style = @attachment.styles[:thumb]
|
109
|
+
end
|
110
|
+
|
111
|
+
it "calls extra_options_for(:thumb/:large) when convert options are requested" do
|
112
|
+
@attachment = attachment path: ":basename.:extension",
|
113
|
+
styles: {thumb: "100x100", large: "400x400"},
|
114
|
+
convert_options: {all: "-do_stuff", thumb: "-thumbnailize"}
|
115
|
+
@style = @attachment.styles[:thumb]
|
116
|
+
@file = StringIO.new("...")
|
117
|
+
@file.stubs(:original_filename).returns("file.jpg")
|
118
|
+
|
119
|
+
@attachment.expects(:extra_options_for).with(:thumb)
|
120
|
+
@attachment.styles[:thumb].convert_options
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
context "An attachment with :source_file_options" do
|
125
|
+
it "does not have called extra_source_file_options_for(:thumb/:large) on initialization" do
|
126
|
+
@attachment = attachment path: ":basename.:extension",
|
127
|
+
styles: {thumb: "100x100", large: "400x400"},
|
128
|
+
source_file_options: {all: "-density 400", thumb: "-depth 8"}
|
129
|
+
@attachment.expects(:extra_source_file_options_for).never
|
130
|
+
@style = @attachment.styles[:thumb]
|
131
|
+
end
|
132
|
+
|
133
|
+
it "calls extra_options_for(:thumb/:large) when convert options are requested" do
|
134
|
+
@attachment = attachment path: ":basename.:extension",
|
135
|
+
styles: {thumb: "100x100", large: "400x400"},
|
136
|
+
source_file_options: {all: "-density 400", thumb: "-depth 8"}
|
137
|
+
@style = @attachment.styles[:thumb]
|
138
|
+
@file = StringIO.new("...")
|
139
|
+
@file.stubs(:original_filename).returns("file.jpg")
|
140
|
+
|
141
|
+
@attachment.expects(:extra_source_file_options_for).with(:thumb)
|
142
|
+
@attachment.styles[:thumb].source_file_options
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
context "A style rule with its own :processors" do
|
147
|
+
before do
|
148
|
+
@attachment = attachment path: ":basename.:extension",
|
149
|
+
styles: {
|
150
|
+
foo: {
|
151
|
+
geometry: "100x100#",
|
152
|
+
format: :png,
|
153
|
+
processors: [:test]
|
154
|
+
}
|
155
|
+
},
|
156
|
+
processors: [:thumbnail]
|
157
|
+
@style = @attachment.styles[:foo]
|
158
|
+
end
|
159
|
+
|
160
|
+
it "does not get processors from the attachment" do
|
161
|
+
@attachment.expects(:processors).never
|
162
|
+
assert_not_equal [:thumbnail], @style.processors
|
163
|
+
end
|
164
|
+
|
165
|
+
it "reports its own processors" do
|
166
|
+
assert_equal [:test], @style.processors
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|
170
|
+
|
171
|
+
context "A style rule with :processors supplied as procs" do
|
172
|
+
before do
|
173
|
+
@attachment = attachment path: ":basename.:extension",
|
174
|
+
styles: {
|
175
|
+
foo: {
|
176
|
+
geometry: "100x100#",
|
177
|
+
format: :png,
|
178
|
+
processors: lambda{|a| [:test]}
|
179
|
+
}
|
180
|
+
},
|
181
|
+
processors: [:thumbnail]
|
182
|
+
end
|
183
|
+
|
184
|
+
it "defers processing of procs until they are needed" do
|
185
|
+
expect(@attachment.styles[:foo].instance_variable_get("@processors")).to be_a Proc
|
186
|
+
end
|
187
|
+
|
188
|
+
it "calls procs when they are needed" do
|
189
|
+
assert_equal [:test], @attachment.styles[:foo].processors
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
context "An attachment with :convert_options and :source_file_options in :styles" do
|
194
|
+
before do
|
195
|
+
@attachment = attachment path: ":basename.:extension",
|
196
|
+
styles: {
|
197
|
+
thumb: "100x100",
|
198
|
+
large: {geometry: "400x400",
|
199
|
+
convert_options: "-do_stuff",
|
200
|
+
source_file_options: "-do_extra_stuff"
|
201
|
+
}
|
202
|
+
}
|
203
|
+
@file = StringIO.new("...")
|
204
|
+
@file.stubs(:original_filename).returns("file.jpg")
|
205
|
+
end
|
206
|
+
|
207
|
+
it "has empty options for :thumb style" do
|
208
|
+
assert_equal "", @attachment.styles[:thumb].processor_options[:convert_options]
|
209
|
+
assert_equal "", @attachment.styles[:thumb].processor_options[:source_file_options]
|
210
|
+
end
|
211
|
+
|
212
|
+
it "has the right options for :large style" do
|
213
|
+
assert_equal "-do_stuff", @attachment.styles[:large].processor_options[:convert_options]
|
214
|
+
assert_equal "-do_extra_stuff", @attachment.styles[:large].processor_options[:source_file_options]
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
context "A style rule supplied with default format" do
|
219
|
+
before do
|
220
|
+
@attachment = attachment default_format: :png,
|
221
|
+
styles: {
|
222
|
+
asstring: "300x300#",
|
223
|
+
aslist: ["300x300#", :jpg],
|
224
|
+
ashash: {
|
225
|
+
geometry: "300x300#",
|
226
|
+
convert_options: "-do_stuff"
|
227
|
+
}
|
228
|
+
}
|
229
|
+
end
|
230
|
+
|
231
|
+
it "has the right number of styles" do
|
232
|
+
expect(@attachment.styles).to be_a Hash
|
233
|
+
assert_equal 3, @attachment.styles.size
|
234
|
+
end
|
235
|
+
|
236
|
+
it "has styles as Style objects" do
|
237
|
+
[:aslist, :ashash, :aslist].each do |s|
|
238
|
+
expect(@attachment.styles[s]).to be_a Paperclip::Style
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
it "has the right geometries" do
|
243
|
+
[:aslist, :ashash, :aslist].each do |s|
|
244
|
+
assert_equal @attachment.styles[s].geometry, "300x300#"
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
it "has the right formats" do
|
249
|
+
assert_equal @attachment.styles[:aslist].format, :jpg
|
250
|
+
assert_equal @attachment.styles[:ashash].format, :png
|
251
|
+
assert_equal @attachment.styles[:asstring].format, :png
|
252
|
+
end
|
253
|
+
|
254
|
+
end
|
255
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Paperclip::TempfileFactory do
|
4
|
+
it "is able to generate a tempfile with the right name" do
|
5
|
+
file = subject.generate("omg.png")
|
6
|
+
assert File.extname(file.path), "png"
|
7
|
+
end
|
8
|
+
|
9
|
+
it "is able to generate a tempfile with the right name with a tilde at the beginning" do
|
10
|
+
file = subject.generate("~omg.png")
|
11
|
+
assert File.extname(file.path), "png"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "is able to generate a tempfile with the right name with a tilde at the end" do
|
15
|
+
file = subject.generate("omg.png~")
|
16
|
+
assert File.extname(file.path), "png"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "is able to generate a tempfile from a file with a really long name" do
|
20
|
+
filename = "#{"longfilename" * 100}.png"
|
21
|
+
file = subject.generate(filename)
|
22
|
+
assert File.extname(file.path), "png"
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'is able to take nothing as a parameter and not error' do
|
26
|
+
file = subject.generate
|
27
|
+
assert File.exist?(file.path)
|
28
|
+
end
|
29
|
+
end
|
@@ -1,70 +1,70 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
class ThumbnailTest < Test::Unit::TestCase
|
1
|
+
require 'spec_helper'
|
4
2
|
|
3
|
+
describe Paperclip::Thumbnail do
|
5
4
|
context "A Paperclip Tempfile" do
|
6
|
-
|
5
|
+
before do
|
7
6
|
@tempfile = Paperclip::Tempfile.new(["file", ".jpg"])
|
8
7
|
end
|
9
8
|
|
10
|
-
|
9
|
+
after { @tempfile.close }
|
11
10
|
|
12
|
-
|
11
|
+
it "has its path contain a real extension" do
|
13
12
|
assert_equal ".jpg", File.extname(@tempfile.path)
|
14
13
|
end
|
15
14
|
|
16
|
-
|
15
|
+
it "is a real Tempfile" do
|
17
16
|
assert @tempfile.is_a?(::Tempfile)
|
18
17
|
end
|
19
18
|
end
|
20
19
|
|
21
20
|
context "Another Paperclip Tempfile" do
|
22
|
-
|
21
|
+
before do
|
23
22
|
@tempfile = Paperclip::Tempfile.new("file")
|
24
23
|
end
|
25
24
|
|
26
|
-
|
25
|
+
after { @tempfile.close }
|
27
26
|
|
28
|
-
|
27
|
+
it "does not have an extension if not given one" do
|
29
28
|
assert_equal "", File.extname(@tempfile.path)
|
30
29
|
end
|
31
30
|
|
32
|
-
|
31
|
+
it "is a real Tempfile" do
|
33
32
|
assert @tempfile.is_a?(::Tempfile)
|
34
33
|
end
|
35
34
|
end
|
36
35
|
|
37
36
|
context "An image" do
|
38
|
-
|
37
|
+
before do
|
39
38
|
@file = File.new(fixture_file("5k.png"), 'rb')
|
40
39
|
end
|
41
40
|
|
42
|
-
|
41
|
+
after { @file.close }
|
43
42
|
|
44
43
|
[["600x600>", "434x66"],
|
45
44
|
["400x400>", "400x61"],
|
46
|
-
["32x32<", "434x66"]
|
45
|
+
["32x32<", "434x66"],
|
46
|
+
[nil, "434x66"]
|
47
47
|
].each do |args|
|
48
48
|
context "being thumbnailed with a geometry of #{args[0]}" do
|
49
|
-
|
50
|
-
@thumb = Paperclip::Thumbnail.new(@file, :
|
49
|
+
before do
|
50
|
+
@thumb = Paperclip::Thumbnail.new(@file, geometry: args[0])
|
51
51
|
end
|
52
52
|
|
53
|
-
|
53
|
+
it "starts with dimensions of 434x66" do
|
54
54
|
cmd = %Q[identify -format "%wx%h" "#{@file.path}"]
|
55
55
|
assert_equal "434x66", `#{cmd}`.chomp
|
56
56
|
end
|
57
57
|
|
58
|
-
|
59
|
-
assert_equal args[0], @thumb.target_geometry.to_s
|
58
|
+
it "reports the correct target geometry" do
|
59
|
+
assert_equal args[0].to_s, @thumb.target_geometry.to_s
|
60
60
|
end
|
61
61
|
|
62
62
|
context "when made" do
|
63
|
-
|
63
|
+
before do
|
64
64
|
@thumb_result = @thumb.make
|
65
65
|
end
|
66
66
|
|
67
|
-
|
67
|
+
it "is the size we expect it to be" do
|
68
68
|
cmd = %Q[identify -format "%wx%h" "#{@thumb_result.path}"]
|
69
69
|
assert_equal args[1], `#{cmd}`.chomp
|
70
70
|
end
|
@@ -73,11 +73,11 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
73
73
|
end
|
74
74
|
|
75
75
|
context "being thumbnailed at 100x50 with cropping" do
|
76
|
-
|
77
|
-
@thumb = Paperclip::Thumbnail.new(@file, :
|
76
|
+
before do
|
77
|
+
@thumb = Paperclip::Thumbnail.new(@file, geometry: "100x50#")
|
78
78
|
end
|
79
79
|
|
80
|
-
|
80
|
+
it "lets us know when a command isn't found versus a processing error" do
|
81
81
|
old_path = ENV['PATH']
|
82
82
|
begin
|
83
83
|
Cocaine::CommandLine.path = ''
|
@@ -93,28 +93,28 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
|
-
|
96
|
+
it "reports its correct current and target geometries" do
|
97
97
|
assert_equal "100x50#", @thumb.target_geometry.to_s
|
98
98
|
assert_equal "434x66", @thumb.current_geometry.to_s
|
99
99
|
end
|
100
100
|
|
101
|
-
|
101
|
+
it "reports its correct format" do
|
102
102
|
assert_nil @thumb.format
|
103
103
|
end
|
104
104
|
|
105
|
-
|
105
|
+
it "has whiny turned on by default" do
|
106
106
|
assert @thumb.whiny
|
107
107
|
end
|
108
108
|
|
109
|
-
|
109
|
+
it "has convert_options set to nil by default" do
|
110
110
|
assert_equal nil, @thumb.convert_options
|
111
111
|
end
|
112
112
|
|
113
|
-
|
113
|
+
it "has source_file_options set to nil by default" do
|
114
114
|
assert_equal nil, @thumb.source_file_options
|
115
115
|
end
|
116
116
|
|
117
|
-
|
117
|
+
it "sends the right command to convert when sent #make" do
|
118
118
|
@thumb.expects(:convert).with do |*arg|
|
119
119
|
arg[0] == ':source -auto-orient -resize "x50" -crop "100x50+114+0" +repage :dest' &&
|
120
120
|
arg[1][:source] == "#{File.expand_path(@thumb.file.path)}[0]"
|
@@ -122,34 +122,34 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
122
122
|
@thumb.make
|
123
123
|
end
|
124
124
|
|
125
|
-
|
125
|
+
it "creates the thumbnail when sent #make" do
|
126
126
|
dst = @thumb.make
|
127
127
|
assert_match /100x50/, `identify "#{dst.path}"`
|
128
128
|
end
|
129
129
|
end
|
130
130
|
|
131
|
-
|
131
|
+
it 'crops a EXIF-rotated image properly' do
|
132
132
|
file = File.new(fixture_file('rotated.jpg'))
|
133
|
-
thumb = Paperclip::Thumbnail.new(file, :
|
133
|
+
thumb = Paperclip::Thumbnail.new(file, geometry: "50x50#")
|
134
134
|
|
135
135
|
output_file = thumb.make
|
136
136
|
|
137
137
|
command = Cocaine::CommandLine.new("identify", "-format %wx%h :file")
|
138
|
-
assert_equal "50x50", command.run(:
|
138
|
+
assert_equal "50x50", command.run(file: output_file.path).strip
|
139
139
|
end
|
140
140
|
|
141
141
|
context "being thumbnailed with source file options set" do
|
142
|
-
|
142
|
+
before do
|
143
143
|
@thumb = Paperclip::Thumbnail.new(@file,
|
144
|
-
:
|
145
|
-
:
|
144
|
+
geometry: "100x50#",
|
145
|
+
source_file_options: "-strip")
|
146
146
|
end
|
147
147
|
|
148
|
-
|
148
|
+
it "has source_file_options value set" do
|
149
149
|
assert_equal ["-strip"], @thumb.source_file_options
|
150
150
|
end
|
151
151
|
|
152
|
-
|
152
|
+
it "sends the right command to convert when sent #make" do
|
153
153
|
@thumb.expects(:convert).with do |*arg|
|
154
154
|
arg[0] == '-strip :source -auto-orient -resize "x50" -crop "100x50+114+0" +repage :dest' &&
|
155
155
|
arg[1][:source] == "#{File.expand_path(@thumb.file.path)}[0]"
|
@@ -157,19 +157,19 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
157
157
|
@thumb.make
|
158
158
|
end
|
159
159
|
|
160
|
-
|
160
|
+
it "creates the thumbnail when sent #make" do
|
161
161
|
dst = @thumb.make
|
162
162
|
assert_match /100x50/, `identify "#{dst.path}"`
|
163
163
|
end
|
164
164
|
|
165
165
|
context "redefined to have bad source_file_options setting" do
|
166
|
-
|
166
|
+
before do
|
167
167
|
@thumb = Paperclip::Thumbnail.new(@file,
|
168
|
-
:
|
169
|
-
:
|
168
|
+
geometry: "100x50#",
|
169
|
+
source_file_options: "-this-aint-no-option")
|
170
170
|
end
|
171
171
|
|
172
|
-
|
172
|
+
it "errors when trying to create the thumbnail" do
|
173
173
|
assert_raises(Paperclip::Error) do
|
174
174
|
silence_stream(STDERR) do
|
175
175
|
@thumb.make
|
@@ -180,17 +180,17 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
180
180
|
end
|
181
181
|
|
182
182
|
context "being thumbnailed with convert options set" do
|
183
|
-
|
183
|
+
before do
|
184
184
|
@thumb = Paperclip::Thumbnail.new(@file,
|
185
|
-
:
|
186
|
-
:
|
185
|
+
geometry: "100x50#",
|
186
|
+
convert_options: "-strip -depth 8")
|
187
187
|
end
|
188
188
|
|
189
|
-
|
189
|
+
it "has convert_options value set" do
|
190
190
|
assert_equal %w"-strip -depth 8", @thumb.convert_options
|
191
191
|
end
|
192
192
|
|
193
|
-
|
193
|
+
it "sends the right command to convert when sent #make" do
|
194
194
|
@thumb.expects(:convert).with do |*arg|
|
195
195
|
arg[0] == ':source -auto-orient -resize "x50" -crop "100x50+114+0" +repage -strip -depth 8 :dest' &&
|
196
196
|
arg[1][:source] == "#{File.expand_path(@thumb.file.path)}[0]"
|
@@ -198,19 +198,19 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
198
198
|
@thumb.make
|
199
199
|
end
|
200
200
|
|
201
|
-
|
201
|
+
it "creates the thumbnail when sent #make" do
|
202
202
|
dst = @thumb.make
|
203
203
|
assert_match /100x50/, `identify "#{dst.path}"`
|
204
204
|
end
|
205
205
|
|
206
206
|
context "redefined to have bad convert_options setting" do
|
207
|
-
|
207
|
+
before do
|
208
208
|
@thumb = Paperclip::Thumbnail.new(@file,
|
209
|
-
:
|
210
|
-
:
|
209
|
+
geometry: "100x50#",
|
210
|
+
convert_options: "-this-aint-no-option")
|
211
211
|
end
|
212
212
|
|
213
|
-
|
213
|
+
it "errors when trying to create the thumbnail" do
|
214
214
|
assert_raises(Paperclip::Error) do
|
215
215
|
silence_stream(STDERR) do
|
216
216
|
@thumb.make
|
@@ -218,7 +218,7 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
218
218
|
end
|
219
219
|
end
|
220
220
|
|
221
|
-
|
221
|
+
it "lets us know when a command isn't found versus a processing error" do
|
222
222
|
old_path = ENV['PATH']
|
223
223
|
begin
|
224
224
|
Cocaine::CommandLine.path = ''
|
@@ -237,20 +237,20 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
237
237
|
end
|
238
238
|
|
239
239
|
context "being thumbnailed with a blank geometry string" do
|
240
|
-
|
240
|
+
before do
|
241
241
|
@thumb = Paperclip::Thumbnail.new(@file,
|
242
|
-
:
|
243
|
-
:
|
242
|
+
geometry: "",
|
243
|
+
convert_options: "-gravity center -crop \"300x300+0-0\"")
|
244
244
|
end
|
245
245
|
|
246
|
-
|
246
|
+
it "does not get resized by default" do
|
247
247
|
assert !@thumb.transformation_command.include?("-resize")
|
248
248
|
end
|
249
249
|
end
|
250
250
|
|
251
251
|
context "being thumbnailed with default animated option (true)" do
|
252
|
-
|
253
|
-
thumb = Paperclip::Thumbnail.new(@file, :
|
252
|
+
it "calls identify to check for animated images when sent #make" do
|
253
|
+
thumb = Paperclip::Thumbnail.new(@file, geometry: "100x50#")
|
254
254
|
thumb.expects(:identify).at_least_once.with do |*arg|
|
255
255
|
arg[0] == '-format %m :file' &&
|
256
256
|
arg[1][:file] == "#{File.expand_path(thumb.file.path)}[0]"
|
@@ -260,11 +260,11 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
260
260
|
end
|
261
261
|
|
262
262
|
context "passing a custom file geometry parser" do
|
263
|
-
|
264
|
-
|
263
|
+
after do
|
264
|
+
Object.send(:remove_const, :GeoParser) if Object.const_defined?(:GeoParser)
|
265
265
|
end
|
266
266
|
|
267
|
-
|
267
|
+
it "produces the appropriate transformation_command" do
|
268
268
|
GeoParser = Class.new do
|
269
269
|
def self.from_file(file)
|
270
270
|
new
|
@@ -275,7 +275,7 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
275
275
|
end
|
276
276
|
end
|
277
277
|
|
278
|
-
thumb = Paperclip::Thumbnail.new(@file, :
|
278
|
+
thumb = Paperclip::Thumbnail.new(@file, geometry: '50x50', file_geometry_parser: ::GeoParser)
|
279
279
|
|
280
280
|
transformation_command = thumb.transformation_command
|
281
281
|
|
@@ -291,11 +291,11 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
291
291
|
end
|
292
292
|
|
293
293
|
context "passing a custom geometry string parser" do
|
294
|
-
|
295
|
-
|
294
|
+
after do
|
295
|
+
Object.send(:remove_const, :GeoParser) if Object.const_defined?(:GeoParser)
|
296
296
|
end
|
297
297
|
|
298
|
-
|
298
|
+
it "produces the appropriate transformation_command" do
|
299
299
|
GeoParser = Class.new do
|
300
300
|
def self.parse(s)
|
301
301
|
new
|
@@ -306,7 +306,7 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
306
306
|
end
|
307
307
|
end
|
308
308
|
|
309
|
-
thumb = Paperclip::Thumbnail.new(@file, :
|
309
|
+
thumb = Paperclip::Thumbnail.new(@file, geometry: '50x50', string_geometry_parser: ::GeoParser)
|
310
310
|
|
311
311
|
transformation_command = thumb.transformation_command
|
312
312
|
|
@@ -317,32 +317,32 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
317
317
|
end
|
318
318
|
|
319
319
|
context "A multipage PDF" do
|
320
|
-
|
320
|
+
before do
|
321
321
|
@file = File.new(fixture_file("twopage.pdf"), 'rb')
|
322
322
|
end
|
323
323
|
|
324
|
-
|
324
|
+
after { @file.close }
|
325
325
|
|
326
|
-
|
326
|
+
it "starts with two pages with dimensions 612x792" do
|
327
327
|
cmd = %Q[identify -format "%wx%h" "#{@file.path}"]
|
328
328
|
assert_equal "612x792"*2, `#{cmd}`.chomp
|
329
329
|
end
|
330
330
|
|
331
331
|
context "being thumbnailed at 100x100 with cropping" do
|
332
|
-
|
333
|
-
@thumb = Paperclip::Thumbnail.new(@file, :
|
332
|
+
before do
|
333
|
+
@thumb = Paperclip::Thumbnail.new(@file, geometry: "100x100#", format: :png)
|
334
334
|
end
|
335
335
|
|
336
|
-
|
336
|
+
it "reports its correct current and target geometries" do
|
337
337
|
assert_equal "100x100#", @thumb.target_geometry.to_s
|
338
338
|
assert_equal "612x792", @thumb.current_geometry.to_s
|
339
339
|
end
|
340
340
|
|
341
|
-
|
341
|
+
it "reports its correct format" do
|
342
342
|
assert_equal :png, @thumb.format
|
343
343
|
end
|
344
344
|
|
345
|
-
|
345
|
+
it "creates the thumbnail when sent #make" do
|
346
346
|
dst = @thumb.make
|
347
347
|
assert_match /100x100/, `identify "#{dst.path}"`
|
348
348
|
end
|
@@ -350,23 +350,23 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
350
350
|
end
|
351
351
|
|
352
352
|
context "An animated gif" do
|
353
|
-
|
353
|
+
before do
|
354
354
|
@file = File.new(fixture_file("animated.gif"), 'rb')
|
355
355
|
end
|
356
356
|
|
357
|
-
|
357
|
+
after { @file.close }
|
358
358
|
|
359
|
-
|
359
|
+
it "starts with 12 frames with size 100x100" do
|
360
360
|
cmd = %Q[identify -format "%wx%h" "#{@file.path}"]
|
361
361
|
assert_equal "100x100"*12, `#{cmd}`.chomp
|
362
362
|
end
|
363
363
|
|
364
364
|
context "with static output" do
|
365
|
-
|
366
|
-
@thumb = Paperclip::Thumbnail.new(@file, :
|
365
|
+
before do
|
366
|
+
@thumb = Paperclip::Thumbnail.new(@file, geometry: "50x50", format: :jpg)
|
367
367
|
end
|
368
368
|
|
369
|
-
|
369
|
+
it "creates the single frame thumbnail when sent #make" do
|
370
370
|
dst = @thumb.make
|
371
371
|
cmd = %Q[identify -format "%wx%h" "#{dst.path}"]
|
372
372
|
assert_equal "50x50", `#{cmd}`.chomp
|
@@ -374,11 +374,11 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
374
374
|
end
|
375
375
|
|
376
376
|
context "with animated output format" do
|
377
|
-
|
378
|
-
@thumb = Paperclip::Thumbnail.new(@file, :
|
377
|
+
before do
|
378
|
+
@thumb = Paperclip::Thumbnail.new(@file, geometry: "50x50", format: :gif)
|
379
379
|
end
|
380
380
|
|
381
|
-
|
381
|
+
it "creates the 12 frames thumbnail when sent #make" do
|
382
382
|
dst = @thumb.make
|
383
383
|
cmd = %Q[identify -format "%wx%h," "#{dst.path}"]
|
384
384
|
frames = `#{cmd}`.chomp.split(',')
|
@@ -386,21 +386,21 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
386
386
|
assert_frame_dimensions (45..50), frames
|
387
387
|
end
|
388
388
|
|
389
|
-
|
389
|
+
it "uses the -coalesce option" do
|
390
390
|
assert_equal @thumb.transformation_command.first, "-coalesce"
|
391
391
|
end
|
392
392
|
|
393
|
-
|
393
|
+
it "uses the -layers 'optimize' option" do
|
394
394
|
assert_equal @thumb.transformation_command.last, '-layers "optimize"'
|
395
395
|
end
|
396
396
|
end
|
397
397
|
|
398
398
|
context "with omitted output format" do
|
399
|
-
|
400
|
-
@thumb = Paperclip::Thumbnail.new(@file, :
|
399
|
+
before do
|
400
|
+
@thumb = Paperclip::Thumbnail.new(@file, geometry: "50x50")
|
401
401
|
end
|
402
402
|
|
403
|
-
|
403
|
+
it "creates the 12 frames thumbnail when sent #make" do
|
404
404
|
dst = @thumb.make
|
405
405
|
cmd = %Q[identify -format "%wx%h," "#{dst.path}"]
|
406
406
|
frames = `#{cmd}`.chomp.split(',')
|
@@ -408,22 +408,22 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
408
408
|
assert_frame_dimensions (45..50), frames
|
409
409
|
end
|
410
410
|
|
411
|
-
|
411
|
+
it "uses the -coalesce option" do
|
412
412
|
assert_equal @thumb.transformation_command.first, "-coalesce"
|
413
413
|
end
|
414
414
|
|
415
|
-
|
415
|
+
it "uses the -layers 'optimize' option" do
|
416
416
|
assert_equal @thumb.transformation_command.last, '-layers "optimize"'
|
417
417
|
end
|
418
418
|
end
|
419
419
|
|
420
420
|
context "with unidentified source format" do
|
421
|
-
|
421
|
+
before do
|
422
422
|
@unidentified_file = File.new(fixture_file("animated.unknown"), 'rb')
|
423
|
-
@thumb = Paperclip::Thumbnail.new(@file, :
|
423
|
+
@thumb = Paperclip::Thumbnail.new(@file, geometry: "60x60")
|
424
424
|
end
|
425
425
|
|
426
|
-
|
426
|
+
it "creates the 12 frames thumbnail when sent #make" do
|
427
427
|
dst = @thumb.make
|
428
428
|
cmd = %Q[identify -format "%wx%h," "#{dst.path}"]
|
429
429
|
frames = `#{cmd}`.chomp.split(',')
|
@@ -431,22 +431,22 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
431
431
|
assert_frame_dimensions (55..60), frames
|
432
432
|
end
|
433
433
|
|
434
|
-
|
434
|
+
it "uses the -coalesce option" do
|
435
435
|
assert_equal @thumb.transformation_command.first, "-coalesce"
|
436
436
|
end
|
437
437
|
|
438
|
-
|
438
|
+
it "uses the -layers 'optimize' option" do
|
439
439
|
assert_equal @thumb.transformation_command.last, '-layers "optimize"'
|
440
440
|
end
|
441
441
|
end
|
442
442
|
|
443
443
|
context "with no source format" do
|
444
|
-
|
444
|
+
before do
|
445
445
|
@unidentified_file = File.new(fixture_file("animated"), 'rb')
|
446
|
-
@thumb = Paperclip::Thumbnail.new(@file, :
|
446
|
+
@thumb = Paperclip::Thumbnail.new(@file, geometry: "70x70")
|
447
447
|
end
|
448
448
|
|
449
|
-
|
449
|
+
it "creates the 12 frames thumbnail when sent #make" do
|
450
450
|
dst = @thumb.make
|
451
451
|
cmd = %Q[identify -format "%wx%h," "#{dst.path}"]
|
452
452
|
frames = `#{cmd}`.chomp.split(',')
|
@@ -454,27 +454,27 @@ class ThumbnailTest < Test::Unit::TestCase
|
|
454
454
|
assert_frame_dimensions (60..70), frames
|
455
455
|
end
|
456
456
|
|
457
|
-
|
457
|
+
it "uses the -coalesce option" do
|
458
458
|
assert_equal @thumb.transformation_command.first, "-coalesce"
|
459
459
|
end
|
460
460
|
|
461
|
-
|
461
|
+
it "uses the -layers 'optimize' option" do
|
462
462
|
assert_equal @thumb.transformation_command.last, '-layers "optimize"'
|
463
463
|
end
|
464
464
|
end
|
465
465
|
|
466
466
|
context "with animated option set to false" do
|
467
|
-
|
468
|
-
@thumb = Paperclip::Thumbnail.new(@file, :
|
467
|
+
before do
|
468
|
+
@thumb = Paperclip::Thumbnail.new(@file, geometry: "50x50", animated: false)
|
469
469
|
end
|
470
470
|
|
471
|
-
|
471
|
+
it "outputs the gif format" do
|
472
472
|
dst = @thumb.make
|
473
473
|
cmd = %Q[identify "#{dst.path}"]
|
474
474
|
assert_match /GIF/, `#{cmd}`.chomp
|
475
475
|
end
|
476
476
|
|
477
|
-
|
477
|
+
it "creates the single frame thumbnail when sent #make" do
|
478
478
|
dst = @thumb.make
|
479
479
|
cmd = %Q[identify -format "%wx%h" "#{dst.path}"]
|
480
480
|
assert_equal "50x50", `#{cmd}`.chomp
|