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.

Files changed (198) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -6
  3. data/.hound.yml +1066 -0
  4. data/.rubocop.yml +1 -0
  5. data/.travis.yml +11 -17
  6. data/Appraisals +6 -14
  7. data/CONTRIBUTING.md +13 -8
  8. data/Gemfile +16 -3
  9. data/LICENSE +1 -3
  10. data/NEWS +167 -49
  11. data/README.md +294 -75
  12. data/RELEASING.md +17 -0
  13. data/Rakefile +6 -8
  14. data/features/basic_integration.feature +24 -6
  15. data/features/step_definitions/attachment_steps.rb +30 -22
  16. data/features/step_definitions/html_steps.rb +2 -2
  17. data/features/step_definitions/rails_steps.rb +44 -14
  18. data/features/step_definitions/web_steps.rb +1 -103
  19. data/features/support/env.rb +2 -2
  20. data/features/support/file_helpers.rb +2 -2
  21. data/features/support/fixtures/gemfile.txt +1 -1
  22. data/features/support/rails.rb +2 -1
  23. data/gemfiles/3.2.gemfile +14 -6
  24. data/gemfiles/4.1.gemfile +19 -0
  25. data/gemfiles/4.2.gemfile +19 -0
  26. data/lib/generators/paperclip/paperclip_generator.rb +0 -2
  27. data/lib/generators/paperclip/templates/paperclip_migration.rb.erb +1 -1
  28. data/lib/paperclip/attachment.rb +132 -38
  29. data/lib/paperclip/attachment_registry.rb +1 -1
  30. data/lib/paperclip/callbacks.rb +11 -1
  31. data/lib/paperclip/content_type_detector.rb +25 -22
  32. data/lib/paperclip/deprecations.rb +42 -0
  33. data/lib/paperclip/errors.rb +5 -0
  34. data/lib/paperclip/file_command_content_type_detector.rb +6 -8
  35. data/lib/paperclip/geometry_detector_factory.rb +3 -1
  36. data/lib/paperclip/geometry_parser_factory.rb +1 -1
  37. data/lib/paperclip/has_attached_file.rb +10 -0
  38. data/lib/paperclip/interpolations/plural_cache.rb +6 -5
  39. data/lib/paperclip/interpolations.rb +25 -12
  40. data/lib/paperclip/io_adapters/abstract_adapter.rb +3 -1
  41. data/lib/paperclip/io_adapters/attachment_adapter.rb +4 -4
  42. data/lib/paperclip/io_adapters/data_uri_adapter.rb +5 -10
  43. data/lib/paperclip/io_adapters/stringio_adapter.rb +6 -10
  44. data/lib/paperclip/io_adapters/uri_adapter.rb +30 -11
  45. data/lib/paperclip/locales/de.yml +18 -0
  46. data/lib/paperclip/locales/en.yml +1 -0
  47. data/lib/paperclip/locales/es.yml +18 -0
  48. data/lib/paperclip/locales/ja.yml +18 -0
  49. data/lib/paperclip/locales/pt-BR.yml +18 -0
  50. data/lib/paperclip/locales/zh-CN.yml +18 -0
  51. data/lib/paperclip/locales/zh-HK.yml +18 -0
  52. data/lib/paperclip/locales/zh-TW.yml +18 -0
  53. data/lib/paperclip/matchers/have_attached_file_matcher.rb +2 -1
  54. data/lib/paperclip/matchers/validate_attachment_presence_matcher.rb +2 -1
  55. data/lib/paperclip/matchers/validate_attachment_size_matcher.rb +2 -1
  56. data/lib/paperclip/media_type_spoof_detector.rb +89 -0
  57. data/lib/paperclip/processor.rb +0 -37
  58. data/lib/paperclip/processor_helpers.rb +50 -0
  59. data/lib/paperclip/rails_environment.rb +25 -0
  60. data/lib/paperclip/schema.rb +10 -2
  61. data/lib/paperclip/storage/filesystem.rb +1 -1
  62. data/lib/paperclip/storage/fog.rb +18 -7
  63. data/lib/paperclip/storage/s3.rb +53 -22
  64. data/lib/paperclip/style.rb +8 -2
  65. data/lib/paperclip/tempfile_factory.rb +5 -1
  66. data/lib/paperclip/thumbnail.rb +12 -10
  67. data/lib/paperclip/url_generator.rb +11 -3
  68. data/lib/paperclip/validators/attachment_content_type_validator.rb +4 -0
  69. data/lib/paperclip/validators/attachment_file_name_validator.rb +80 -0
  70. data/lib/paperclip/validators/attachment_file_type_ignorance_validator.rb +29 -0
  71. data/lib/paperclip/validators/attachment_presence_validator.rb +4 -0
  72. data/lib/paperclip/validators/attachment_size_validator.rb +11 -3
  73. data/lib/paperclip/validators/media_type_spoof_detection_validator.rb +27 -0
  74. data/lib/paperclip/validators.rb +10 -3
  75. data/lib/paperclip/version.rb +1 -1
  76. data/lib/paperclip.rb +26 -8
  77. data/lib/tasks/paperclip.rake +17 -2
  78. data/paperclip.gemspec +16 -14
  79. data/shoulda_macros/paperclip.rb +0 -1
  80. data/spec/paperclip/attachment_definitions_spec.rb +13 -0
  81. data/{test/attachment_processing_test.rb → spec/paperclip/attachment_processing_spec.rb} +20 -21
  82. data/spec/paperclip/attachment_registry_spec.rb +130 -0
  83. data/{test/attachment_test.rb → spec/paperclip/attachment_spec.rb} +438 -397
  84. data/{test/content_type_detector_test.rb → spec/paperclip/content_type_detector_spec.rb} +16 -19
  85. data/spec/paperclip/deprecations_spec.rb +65 -0
  86. data/{test/file_command_content_type_detector_test.rb → spec/paperclip/file_command_content_type_detector_spec.rb} +5 -6
  87. data/spec/paperclip/filename_cleaner_spec.rb +14 -0
  88. data/spec/paperclip/geometry_detector_spec.rb +39 -0
  89. data/{test/geometry_parser_test.rb → spec/paperclip/geometry_parser_spec.rb} +27 -27
  90. data/{test/geometry_test.rb → spec/paperclip/geometry_spec.rb} +50 -52
  91. data/spec/paperclip/glue_spec.rb +44 -0
  92. data/{test/has_attached_file_test.rb → spec/paperclip/has_attached_file_spec.rb} +45 -28
  93. data/{test/integration_test.rb → spec/paperclip/integration_spec.rb} +134 -126
  94. data/{test/interpolations_test.rb → spec/paperclip/interpolations_spec.rb} +70 -46
  95. data/spec/paperclip/io_adapters/abstract_adapter_spec.rb +78 -0
  96. data/{test/io_adapters/attachment_adapter_test.rb → spec/paperclip/io_adapters/attachment_adapter_spec.rb} +27 -29
  97. data/{test/io_adapters/data_uri_adapter_test.rb → spec/paperclip/io_adapters/data_uri_adapter_spec.rb} +26 -17
  98. data/spec/paperclip/io_adapters/empty_string_adapter_spec.rb +17 -0
  99. data/{test/io_adapters/file_adapter_test.rb → spec/paperclip/io_adapters/file_adapter_spec.rb} +36 -40
  100. data/{test/io_adapters/http_url_proxy_adapter_test.rb → spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb} +31 -29
  101. data/spec/paperclip/io_adapters/identity_adapter_spec.rb +8 -0
  102. data/{test/io_adapters/nil_adapter_test.rb → spec/paperclip/io_adapters/nil_adapter_spec.rb} +7 -7
  103. data/{test/io_adapters/registry_test.rb → spec/paperclip/io_adapters/registry_spec.rb} +10 -7
  104. data/{test/io_adapters/stringio_adapter_test.rb → spec/paperclip/io_adapters/stringio_adapter_spec.rb} +20 -17
  105. data/{test/io_adapters/uploaded_file_adapter_test.rb → spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb} +41 -41
  106. data/{test/io_adapters/uri_adapter_test.rb → spec/paperclip/io_adapters/uri_adapter_spec.rb} +53 -28
  107. data/spec/paperclip/matchers/have_attached_file_matcher_spec.rb +19 -0
  108. data/spec/paperclip/matchers/validate_attachment_content_type_matcher_spec.rb +99 -0
  109. data/spec/paperclip/matchers/validate_attachment_presence_matcher_spec.rb +69 -0
  110. data/spec/paperclip/matchers/validate_attachment_size_matcher_spec.rb +88 -0
  111. data/spec/paperclip/media_type_spoof_detector_spec.rb +79 -0
  112. data/spec/paperclip/meta_class_spec.rb +30 -0
  113. data/spec/paperclip/paperclip_missing_attachment_styles_spec.rb +84 -0
  114. data/{test/paperclip_test.rb → spec/paperclip/paperclip_spec.rb} +53 -48
  115. data/spec/paperclip/plural_cache_spec.rb +37 -0
  116. data/spec/paperclip/processor_helpers_spec.rb +57 -0
  117. data/{test/processor_test.rb → spec/paperclip/processor_spec.rb} +5 -5
  118. data/spec/paperclip/rails_environment_spec.rb +33 -0
  119. data/{test/rake_test.rb → spec/paperclip/rake_spec.rb} +15 -15
  120. data/spec/paperclip/schema_spec.rb +248 -0
  121. data/{test/storage/filesystem_test.rb → spec/paperclip/storage/filesystem_spec.rb} +18 -18
  122. data/spec/paperclip/storage/fog_spec.rb +535 -0
  123. data/spec/paperclip/storage/s3_live_spec.rb +182 -0
  124. data/spec/paperclip/storage/s3_spec.rb +1526 -0
  125. data/spec/paperclip/style_spec.rb +255 -0
  126. data/spec/paperclip/tempfile_factory_spec.rb +33 -0
  127. data/{test/thumbnail_test.rb → spec/paperclip/thumbnail_spec.rb} +123 -107
  128. data/spec/paperclip/url_generator_spec.rb +211 -0
  129. data/spec/paperclip/validators/attachment_content_type_validator_spec.rb +322 -0
  130. data/spec/paperclip/validators/attachment_file_name_validator_spec.rb +160 -0
  131. data/{test/validators/attachment_presence_validator_test.rb → spec/paperclip/validators/attachment_presence_validator_spec.rb} +20 -20
  132. data/{test/validators/attachment_size_validator_test.rb → spec/paperclip/validators/attachment_size_validator_spec.rb} +65 -58
  133. data/spec/paperclip/validators/media_type_spoof_detection_validator_spec.rb +52 -0
  134. data/spec/paperclip/validators_spec.rb +164 -0
  135. data/spec/spec_helper.rb +43 -0
  136. data/spec/support/assertions.rb +71 -0
  137. data/spec/support/deprecations.rb +9 -0
  138. data/spec/support/fake_model.rb +25 -0
  139. data/spec/support/fake_rails.rb +12 -0
  140. data/spec/support/fixtures/empty.html +1 -0
  141. data/spec/support/fixtures/empty.xlsx +0 -0
  142. data/spec/support/fixtures/spaced file.jpg +0 -0
  143. data/spec/support/matchers/accept.rb +5 -0
  144. data/spec/support/matchers/exist.rb +5 -0
  145. data/spec/support/matchers/have_column.rb +23 -0
  146. data/spec/support/model_reconstruction.rb +60 -0
  147. data/spec/support/rails_helpers.rb +7 -0
  148. data/spec/support/test_data.rb +13 -0
  149. data/spec/support/version_helper.rb +9 -0
  150. metadata +334 -219
  151. data/RUNNING_TESTS.md +0 -4
  152. data/gemfiles/3.0.gemfile +0 -11
  153. data/gemfiles/3.1.gemfile +0 -11
  154. data/gemfiles/4.0.gemfile +0 -11
  155. data/test/attachment_definitions_test.rb +0 -12
  156. data/test/attachment_registry_test.rb +0 -88
  157. data/test/filename_cleaner_test.rb +0 -14
  158. data/test/generator_test.rb +0 -84
  159. data/test/geometry_detector_test.rb +0 -24
  160. data/test/helper.rb +0 -232
  161. data/test/io_adapters/abstract_adapter_test.rb +0 -58
  162. data/test/io_adapters/empty_string_adapter_test.rb +0 -18
  163. data/test/io_adapters/identity_adapter_test.rb +0 -8
  164. data/test/matchers/have_attached_file_matcher_test.rb +0 -24
  165. data/test/matchers/validate_attachment_content_type_matcher_test.rb +0 -110
  166. data/test/matchers/validate_attachment_presence_matcher_test.rb +0 -69
  167. data/test/matchers/validate_attachment_size_matcher_test.rb +0 -86
  168. data/test/meta_class_test.rb +0 -32
  169. data/test/paperclip_missing_attachment_styles_test.rb +0 -90
  170. data/test/plural_cache_test.rb +0 -36
  171. data/test/schema_test.rb +0 -200
  172. data/test/storage/fog_test.rb +0 -473
  173. data/test/storage/s3_live_test.rb +0 -179
  174. data/test/storage/s3_test.rb +0 -1356
  175. data/test/style_test.rb +0 -213
  176. data/test/support/mock_model.rb +0 -2
  177. data/test/tempfile_factory_test.rb +0 -17
  178. data/test/url_generator_test.rb +0 -187
  179. data/test/validators/attachment_content_type_validator_test.rb +0 -324
  180. data/test/validators_test.rb +0 -61
  181. /data/{test → spec}/database.yml +0 -0
  182. /data/{test → spec/support}/fixtures/12k.png +0 -0
  183. /data/{test → spec/support}/fixtures/50x50.png +0 -0
  184. /data/{test → spec/support}/fixtures/5k.png +0 -0
  185. /data/{test → spec/support}/fixtures/animated +0 -0
  186. /data/{test → spec/support}/fixtures/animated.gif +0 -0
  187. /data/{test → spec/support}/fixtures/animated.unknown +0 -0
  188. /data/{test → spec/support}/fixtures/bad.png +0 -0
  189. /data/{test → spec/support}/fixtures/fog.yml +0 -0
  190. /data/{test → spec/support}/fixtures/rotated.jpg +0 -0
  191. /data/{test → spec/support}/fixtures/s3.yml +0 -0
  192. /data/{test → spec/support}/fixtures/spaced file.png +0 -0
  193. /data/{test → spec/support}/fixtures/text.txt +0 -0
  194. /data/{test → spec/support}/fixtures/twopage.pdf +0 -0
  195. /data/{test → spec/support}/fixtures/uppercase.PNG +0 -0
  196. /data/{test → spec}/support/mock_attachment.rb +0 -0
  197. /data/{test → spec}/support/mock_interpolator.rb +0 -0
  198. /data/{test → spec}/support/mock_url_generator_builder.rb +0 -0
@@ -1,21 +1,20 @@
1
1
  # encoding: utf-8
2
-
3
- require './test/helper'
2
+ require 'spec_helper'
4
3
  require 'open-uri'
5
4
 
6
- class IntegrationTest < Test::Unit::TestCase
5
+ describe 'Paperclip' do
7
6
  context "Many models at once" do
8
- setup do
7
+ before do
9
8
  rebuild_model
10
- @file = File.new(fixture_file("5k.png"), 'rb')
9
+ @file = File.new(fixture_file("5k.png"), 'rb')
11
10
  300.times do |i|
12
- Dummy.create! :avatar => @file
11
+ Dummy.create! avatar: @file
13
12
  end
14
13
  end
15
14
 
16
- teardown { @file.close }
15
+ after { @file.close }
17
16
 
18
- should "not exceed the open file limit" do
17
+ it "does not exceed the open file limit" do
19
18
  assert_nothing_raised do
20
19
  Dummy.all.each { |dummy| dummy.avatar }
21
20
  end
@@ -23,24 +22,24 @@ class IntegrationTest < Test::Unit::TestCase
23
22
  end
24
23
 
25
24
  context "An attachment" do
26
- setup do
27
- rebuild_model :styles => { :thumb => "50x50#" }
25
+ before do
26
+ rebuild_model styles: { thumb: "50x50#" }
28
27
  @dummy = Dummy.new
29
28
  @file = File.new(fixture_file("5k.png"), 'rb')
30
29
  @dummy.avatar = @file
31
30
  assert @dummy.save
32
31
  end
33
32
 
34
- teardown { @file.close }
33
+ after { @file.close }
35
34
 
36
- should "create its thumbnails properly" do
35
+ it "creates its thumbnails properly" do
37
36
  assert_match(/\b50x50\b/, `identify "#{@dummy.avatar.path(:thumb)}"`)
38
37
  end
39
38
 
40
39
  context 'reprocessing with unreadable original' do
41
- setup { File.chmod(0000, @dummy.avatar.path) }
40
+ before { File.chmod(0000, @dummy.avatar.path) }
42
41
 
43
- should "not raise an error" do
42
+ it "does not raise an error" do
44
43
  assert_nothing_raised do
45
44
  silence_stream(STDERR) do
46
45
  @dummy.avatar.reprocess!
@@ -48,19 +47,19 @@ class IntegrationTest < Test::Unit::TestCase
48
47
  end
49
48
  end
50
49
 
51
- should "return false" do
50
+ it "returns false" do
52
51
  silence_stream(STDERR) do
53
52
  assert !@dummy.avatar.reprocess!
54
53
  end
55
54
  end
56
55
 
57
- teardown { File.chmod(0644, @dummy.avatar.path) }
56
+ after { File.chmod(0644, @dummy.avatar.path) }
58
57
  end
59
58
 
60
59
  context "redefining its attachment styles" do
61
- setup do
60
+ before do
62
61
  Dummy.class_eval do
63
- has_attached_file :avatar, :styles => { :thumb => "150x25#", :dynamic => lambda { |a| '50x50#' } }
62
+ has_attached_file :avatar, styles: { thumb: "150x25#", dynamic: lambda { |a| '50x50#' } }
64
63
  end
65
64
  @d2 = Dummy.find(@dummy.id)
66
65
  @original_timestamp = @d2.avatar_updated_at
@@ -68,37 +67,37 @@ class IntegrationTest < Test::Unit::TestCase
68
67
  @d2.save
69
68
  end
70
69
 
71
- should "create its thumbnails properly" do
70
+ it "creates its thumbnails properly" do
72
71
  assert_match(/\b150x25\b/, `identify "#{@dummy.avatar.path(:thumb)}"`)
73
72
  assert_match(/\b50x50\b/, `identify "#{@dummy.avatar.path(:dynamic)}"`)
74
73
  end
75
74
 
76
- should "change the timestamp" do
75
+ it "changes the timestamp" do
77
76
  assert_not_equal @original_timestamp, @d2.avatar_updated_at
78
77
  end
79
78
  end
80
79
  end
81
80
 
82
81
  context "Attachment" do
83
- setup do
82
+ before do
84
83
  @thumb_path = "tmp/public/system/dummies/avatars/000/000/001/thumb/5k.png"
85
- File.delete(@thumb_path) if File.exists?(@thumb_path)
86
- rebuild_model :styles => { :thumb => "50x50#" }
84
+ File.delete(@thumb_path) if File.exist?(@thumb_path)
85
+ rebuild_model styles: { thumb: "50x50#" }
87
86
  @dummy = Dummy.new
88
87
  @file = File.new(fixture_file("5k.png"), 'rb')
89
88
 
90
89
  end
91
90
 
92
- teardown { @file.close }
91
+ after { @file.close }
93
92
 
94
- should "not create the thumbnails upon saving when post-processing is disabled" do
93
+ it "does not create the thumbnails upon saving when post-processing is disabled" do
95
94
  @dummy.avatar.post_processing = false
96
95
  @dummy.avatar = @file
97
96
  assert @dummy.save
98
97
  assert_file_not_exists @thumb_path
99
98
  end
100
99
 
101
- should "create the thumbnails upon saving when post_processing is enabled" do
100
+ it "creates the thumbnails upon saving when post_processing is enabled" do
102
101
  @dummy.avatar.post_processing = true
103
102
  @dummy.avatar = @file
104
103
  assert @dummy.save
@@ -107,12 +106,12 @@ class IntegrationTest < Test::Unit::TestCase
107
106
  end
108
107
 
109
108
  context "Attachment with no generated thumbnails" do
110
- setup do
109
+ before do
111
110
  @thumb_small_path = "tmp/public/system/dummies/avatars/000/000/001/thumb_small/5k.png"
112
111
  @thumb_large_path = "tmp/public/system/dummies/avatars/000/000/001/thumb_large/5k.png"
113
- File.delete(@thumb_small_path) if File.exists?(@thumb_small_path)
114
- File.delete(@thumb_large_path) if File.exists?(@thumb_large_path)
115
- rebuild_model :styles => { :thumb_small => "50x50#", :thumb_large => "60x60#" }
112
+ File.delete(@thumb_small_path) if File.exist?(@thumb_small_path)
113
+ File.delete(@thumb_large_path) if File.exist?(@thumb_large_path)
114
+ rebuild_model styles: { thumb_small: "50x50#", thumb_large: "60x60#" }
116
115
  @dummy = Dummy.new
117
116
  @file = File.new(fixture_file("5k.png"), 'rb')
118
117
 
@@ -122,9 +121,9 @@ class IntegrationTest < Test::Unit::TestCase
122
121
  @dummy.avatar.post_processing = true
123
122
  end
124
123
 
125
- teardown { @file.close }
124
+ after { @file.close }
126
125
 
127
- should "allow us to create all thumbnails in one go" do
126
+ it "allows us to create all thumbnails in one go" do
128
127
  assert_file_not_exists(@thumb_small_path)
129
128
  assert_file_not_exists(@thumb_large_path)
130
129
 
@@ -134,7 +133,7 @@ class IntegrationTest < Test::Unit::TestCase
134
133
  assert_file_exists(@thumb_large_path)
135
134
  end
136
135
 
137
- should "allow us to selectively create each thumbnail" do
136
+ it "allows us to selectively create each thumbnail" do
138
137
  assert_file_not_exists(@thumb_small_path)
139
138
  assert_file_not_exists(@thumb_large_path)
140
139
 
@@ -148,59 +147,65 @@ class IntegrationTest < Test::Unit::TestCase
148
147
  end
149
148
 
150
149
  context "A model that modifies its original" do
151
- setup do
152
- rebuild_model :styles => { :original => "2x2#" }
150
+ before do
151
+ rebuild_model styles: { original: "2x2#" }
153
152
  @dummy = Dummy.new
154
153
  @file = File.new(fixture_file("5k.png"), 'rb')
155
154
  @dummy.avatar = @file
156
155
  end
157
156
 
158
- should "report the file size of the processed file and not the original" do
157
+ it "reports the file size of the processed file and not the original" do
159
158
  assert_not_equal File.size(@file.path), @dummy.avatar.size
160
159
  end
161
160
 
162
- teardown { @file.close }
161
+ after { @file.close }
163
162
  end
164
163
 
165
164
  context "A model with attachments scoped under an id" do
166
- setup do
167
- rebuild_model :styles => { :large => "100x100",
168
- :medium => "50x50" },
169
- :path => ":rails_root/tmp/:id/:attachments/:style.:extension"
165
+ before do
166
+ rebuild_model styles: { large: "100x100",
167
+ medium: "50x50" },
168
+ path: ":rails_root/tmp/:id/:attachments/:style.:extension"
170
169
  @dummy = Dummy.new
171
170
  @file = File.new(fixture_file("5k.png"), 'rb')
172
171
  @dummy.avatar = @file
173
172
  end
174
173
 
175
- teardown { @file.close }
174
+ after { @file.close }
176
175
 
177
176
  context "when saved" do
178
- setup do
177
+ before do
179
178
  @dummy.save
180
179
  @saved_path = @dummy.avatar.path(:large)
181
180
  end
182
181
 
183
- should "have a large file in the right place" do
182
+ it "has a large file in the right place" do
184
183
  assert_file_exists(@dummy.avatar.path(:large))
185
184
  end
186
185
 
187
186
  context "and deleted" do
188
- setup do
187
+ before do
189
188
  @dummy.avatar.clear
190
189
  @dummy.save
191
190
  end
192
191
 
193
- should "not have a large file in the right place anymore" do
192
+ it "does not have a large file in the right place anymore" do
194
193
  assert_file_not_exists(@saved_path)
195
194
  end
196
195
 
197
- should "not have its next two parent directories" do
196
+ it "does not have its next two parent directories" do
198
197
  assert_file_not_exists(File.dirname(@saved_path))
199
198
  assert_file_not_exists(File.dirname(File.dirname(@saved_path)))
200
199
  end
200
+ end
201
201
 
202
- before_should "not die if an unexpected SystemCallError happens" do
202
+ context 'and deleted where the delete fails' do
203
+ it "does not die if an unexpected SystemCallError happens" do
203
204
  FileUtils.stubs(:rmdir).raises(Errno::EPIPE)
205
+ assert_nothing_raised do
206
+ @dummy.avatar.clear
207
+ @dummy.save
208
+ end
204
209
  end
205
210
  end
206
211
  end
@@ -208,19 +213,19 @@ class IntegrationTest < Test::Unit::TestCase
208
213
 
209
214
  [000,002,022].each do |umask|
210
215
  context "when the umask is #{umask}" do
211
- setup do
216
+ before do
212
217
  rebuild_model
213
218
  @dummy = Dummy.new
214
219
  @file = File.new(fixture_file("5k.png"), 'rb')
215
220
  @umask = File.umask(umask)
216
221
  end
217
222
 
218
- teardown do
223
+ after do
219
224
  File.umask @umask
220
225
  @file.close
221
226
  end
222
227
 
223
- should "respect the current umask" do
228
+ it "respects the current umask" do
224
229
  @dummy.avatar = @file
225
230
  @dummy.save
226
231
  assert_equal 0666&~umask, 0666&File.stat(@dummy.avatar.path).mode
@@ -230,17 +235,17 @@ class IntegrationTest < Test::Unit::TestCase
230
235
 
231
236
  [0666,0664,0640].each do |perms|
232
237
  context "when the perms are #{perms}" do
233
- setup do
234
- rebuild_model :override_file_permissions => perms
238
+ before do
239
+ rebuild_model override_file_permissions: perms
235
240
  @dummy = Dummy.new
236
241
  @file = File.new(fixture_file("5k.png"), 'rb')
237
242
  end
238
243
 
239
- teardown do
244
+ after do
240
245
  @file.close
241
246
  end
242
247
 
243
- should "respect the current perms" do
248
+ it "respects the current perms" do
244
249
  @dummy.avatar = @file
245
250
  @dummy.save
246
251
  assert_equal perms, File.stat(@dummy.avatar.path).mode & 0777
@@ -248,23 +253,23 @@ class IntegrationTest < Test::Unit::TestCase
248
253
  end
249
254
  end
250
255
 
251
- should "skip chmod operation, when override_file_permissions is set to false (e.g. useful when using CIFS mounts)" do
256
+ it "skips chmod operation, when override_file_permissions is set to false (e.g. useful when using CIFS mounts)" do
252
257
  FileUtils.expects(:chmod).never
253
258
 
254
- rebuild_model :override_file_permissions => false
259
+ rebuild_model override_file_permissions: false
255
260
  dummy = Dummy.create!
256
261
  dummy.avatar = @file
257
262
  dummy.save
258
263
  end
259
264
 
260
265
  context "A model with a filesystem attachment" do
261
- setup do
262
- rebuild_model :styles => { :large => "300x300>",
263
- :medium => "100x100",
264
- :thumb => ["32x32#", :gif] },
265
- :default_style => :medium,
266
- :url => "/:attachment/:class/:style/:id/:basename.:extension",
267
- :path => ":rails_root/tmp/:attachment/:class/:style/:id/:basename.:extension"
266
+ before do
267
+ rebuild_model styles: { large: "300x300>",
268
+ medium: "100x100",
269
+ thumb: ["32x32#", :gif] },
270
+ default_style: :medium,
271
+ url: "/:attachment/:class/:style/:id/:basename.:extension",
272
+ path: ":rails_root/tmp/:attachment/:class/:style/:id/:basename.:extension"
268
273
  @dummy = Dummy.new
269
274
  @file = File.new(fixture_file("5k.png"), 'rb')
270
275
  @bad_file = File.new(fixture_file("bad.png"), 'rb')
@@ -274,9 +279,9 @@ class IntegrationTest < Test::Unit::TestCase
274
279
  assert @dummy.save
275
280
  end
276
281
 
277
- teardown { [@file, @bad_file].each(&:close) }
282
+ after { [@file, @bad_file].each(&:close) }
278
283
 
279
- should "write and delete its files" do
284
+ it "writes and delete its files" do
280
285
  [["434x66", :original],
281
286
  ["300x46", :large],
282
287
  ["100x15", :medium],
@@ -314,7 +319,7 @@ class IntegrationTest < Test::Unit::TestCase
314
319
  assert_nil @d2.avatar_file_name
315
320
  end
316
321
 
317
- should "work exactly the same when new as when reloaded" do
322
+ it "works exactly the same when new as when reloaded" do
318
323
  @d2 = Dummy.find(@dummy.id)
319
324
 
320
325
  assert_equal @dummy.avatar_file_name, @d2.avatar_file_name
@@ -332,18 +337,18 @@ class IntegrationTest < Test::Unit::TestCase
332
337
  end
333
338
  end
334
339
 
335
- should "not abide things that don't have adapters" do
340
+ it "does not abide things that don't have adapters" do
336
341
  assert_raises(Paperclip::AdapterRegistry::NoHandlerError) do
337
342
  @dummy.avatar = "not a file"
338
343
  end
339
344
  end
340
345
 
341
- should "not be ok with bad files" do
346
+ it "is not ok with bad files" do
342
347
  @dummy.avatar = @bad_file
343
348
  assert ! @dummy.valid?
344
349
  end
345
350
 
346
- should "know the difference between good files, bad files, and not files when validating" do
351
+ it "knows the difference between good files, bad files, and not files when validating" do
347
352
  Dummy.validates_attachment_presence :avatar
348
353
  @d2 = Dummy.find(@dummy.id)
349
354
  @d2.avatar = @file
@@ -352,7 +357,7 @@ class IntegrationTest < Test::Unit::TestCase
352
357
  assert ! @d2.valid?
353
358
  end
354
359
 
355
- should "be able to reload without saving and not have the file disappear" do
360
+ it "is able to reload without saving and not have the file disappear" do
356
361
  @dummy.avatar = @file
357
362
  assert @dummy.save, @dummy.errors.full_messages.inspect
358
363
  @dummy.avatar.clear
@@ -362,33 +367,33 @@ class IntegrationTest < Test::Unit::TestCase
362
367
  end
363
368
 
364
369
  context "that is assigned its file from another Paperclip attachment" do
365
- setup do
370
+ before do
366
371
  @dummy2 = Dummy.new
367
- @file2 = File.new(fixture_file("12k.png"), 'rb')
368
- assert @dummy2.avatar = @file2
372
+ @file2 = File.new(fixture_file("12k.png"), 'rb')
373
+ assert @dummy2.avatar = @file2
369
374
  @dummy2.save
370
375
  end
371
376
 
372
- teardown { @file2.close }
377
+ after { @file2.close }
373
378
 
374
- should "work when assigned a file" do
379
+ it "works when assigned a file" do
375
380
  assert_not_equal `identify -format "%wx%h" "#{@dummy.avatar.path(:original)}"`,
376
- `identify -format "%wx%h" "#{@dummy2.avatar.path(:original)}"`
381
+ `identify -format "%wx%h" "#{@dummy2.avatar.path(:original)}"`
377
382
 
378
383
  assert @dummy.avatar = @dummy2.avatar
379
384
  @dummy.save
380
385
  assert_equal @dummy.avatar_file_name, @dummy2.avatar_file_name
381
386
  assert_equal `identify -format "%wx%h" "#{@dummy.avatar.path(:original)}"`,
382
- `identify -format "%wx%h" "#{@dummy2.avatar.path(:original)}"`
387
+ `identify -format "%wx%h" "#{@dummy2.avatar.path(:original)}"`
383
388
  end
384
389
  end
385
390
 
386
391
  end
387
392
 
388
393
  context "A model with an attachments association and a Paperclip attachment" do
389
- setup do
394
+ before do
390
395
  Dummy.class_eval do
391
- has_many :attachments, :class_name => 'Dummy'
396
+ has_many :attachments, class_name: 'Dummy'
392
397
  end
393
398
 
394
399
  @file = File.new(fixture_file("5k.png"), 'rb')
@@ -396,45 +401,45 @@ class IntegrationTest < Test::Unit::TestCase
396
401
  @dummy.avatar = @file
397
402
  end
398
403
 
399
- teardown { @file.close }
404
+ after { @file.close }
400
405
 
401
- should "should not error when saving" do
406
+ it "does not error when saving" do
402
407
  @dummy.save!
403
408
  end
404
409
  end
405
410
 
406
411
  context "A model with an attachment with hash in file name" do
407
- setup do
408
- @settings = { :styles => { :thumb => "50x50#" },
409
- :path => ":rails_root/public/system/:attachment/:id_partition/:style/:hash.:extension",
410
- :url => "/system/:attachment/:id_partition/:style/:hash.:extension",
411
- :hash_secret => "somesecret" }
412
+ before do
413
+ @settings = { styles: { thumb: "50x50#" },
414
+ path: ":rails_root/public/system/:attachment/:id_partition/:style/:hash.:extension",
415
+ url: "/system/:attachment/:id_partition/:style/:hash.:extension",
416
+ hash_secret: "somesecret" }
412
417
 
413
418
  rebuild_model @settings
414
419
 
415
420
  @file = File.new(fixture_file("5k.png"), 'rb')
416
- @dummy = Dummy.create! :avatar => @file
421
+ @dummy = Dummy.create! avatar: @file
417
422
  end
418
423
 
419
- teardown do
424
+ after do
420
425
  @file.close
421
426
  end
422
427
 
423
- should "be accessible" do
428
+ it "is accessible" do
424
429
  assert_file_exists(@dummy.avatar.path(:original))
425
430
  assert_file_exists(@dummy.avatar.path(:thumb))
426
431
  end
427
432
 
428
433
  context "when new style is added" do
429
- setup do
434
+ before do
430
435
  @dummy.avatar.options[:styles][:mini] = "25x25#"
431
436
  @dummy.avatar.instance_variable_set :@normalized_styles, nil
432
- Time.stubs(:now => Time.now + 10)
437
+ Time.stubs(now: Time.now + 10)
433
438
  @dummy.avatar.reprocess!
434
439
  @dummy.reload
435
440
  end
436
441
 
437
- should "make all the styles accessible" do
442
+ it "makes all the styles accessible" do
438
443
  assert_file_exists(@dummy.avatar.path(:original))
439
444
  assert_file_exists(@dummy.avatar.path(:thumb))
440
445
  assert_file_exists(@dummy.avatar.path(:mini))
@@ -464,22 +469,25 @@ class IntegrationTest < Test::Unit::TestCase
464
469
  end
465
470
 
466
471
  context "A model with an S3 attachment" do
467
- setup do
468
- rebuild_model :styles => { :large => "300x300>",
469
- :medium => "100x100",
470
- :thumb => ["32x32#", :gif],
471
- :custom => {
472
- :geometry => "32x32#",
473
- :s3_headers => { 'Cache-Control' => 'max-age=31557600' },
474
- :s3_metadata => { 'foo' => 'bar'}
475
- }
476
- },
477
- :storage => :s3,
478
- :s3_credentials => File.new(fixture_file('s3.yml')),
479
- :s3_options => { :logger => Paperclip.logger },
480
- :default_style => :medium,
481
- :bucket => ENV['S3_BUCKET'],
482
- :path => ":class/:attachment/:id/:style/:basename.:extension"
472
+ before do
473
+ rebuild_model(
474
+ styles: {
475
+ large: "300x300>",
476
+ medium: "100x100",
477
+ thumb: ["32x32#", :gif],
478
+ custom: {
479
+ geometry: "32x32#",
480
+ s3_headers: { 'Cache-Control' => 'max-age=31557600' },
481
+ s3_metadata: { 'foo' => 'bar'}
482
+ }
483
+ },
484
+ storage: :s3,
485
+ s3_credentials: File.new(fixture_file('s3.yml')),
486
+ s3_options: { logger: Paperclip.logger },
487
+ default_style: :medium,
488
+ bucket: ENV['S3_BUCKET'],
489
+ path: ":class/:attachment/:id/:style/:basename.:extension"
490
+ )
483
491
 
484
492
  @dummy = Dummy.new
485
493
  @file = File.new(fixture_file('5k.png'), 'rb')
@@ -492,29 +500,29 @@ class IntegrationTest < Test::Unit::TestCase
492
500
  @files_on_s3 = s3_files_for(@dummy.avatar)
493
501
  end
494
502
 
495
- teardown do
503
+ after do
496
504
  @file.close
497
505
  @bad_file.close
498
506
  @files_on_s3.values.each(&:close) if @files_on_s3
499
507
  end
500
508
 
501
509
  context 'assigning itself to a new model' do
502
- setup do
510
+ before do
503
511
  @d2 = Dummy.new
504
512
  @d2.avatar = @dummy.avatar
505
513
  @d2.save
506
514
  end
507
515
 
508
- should "have the same name as the old file" do
516
+ it "has the same name as the old file" do
509
517
  assert_equal @d2.avatar.original_filename, @dummy.avatar.original_filename
510
518
  end
511
519
  end
512
520
 
513
- should "have the same contents as the original" do
521
+ it "has the same contents as the original" do
514
522
  assert_equal @file.read, @files_on_s3[:original].read
515
523
  end
516
524
 
517
- should "write and delete its files" do
525
+ it "writes and delete its files" do
518
526
  [["434x66", :original],
519
527
  ["300x46", :large],
520
528
  ["100x15", :medium],
@@ -546,7 +554,7 @@ class IntegrationTest < Test::Unit::TestCase
546
554
  assert_nil @d2.avatar_file_name
547
555
  end
548
556
 
549
- should "work exactly the same when new as when reloaded" do
557
+ it "works exactly the same when new as when reloaded" do
550
558
  @d2 = Dummy.find(@dummy.id)
551
559
 
552
560
  assert_equal @dummy.avatar_file_name, @d2.avatar_file_name
@@ -570,7 +578,7 @@ class IntegrationTest < Test::Unit::TestCase
570
578
  end
571
579
  end
572
580
 
573
- should "know the difference between good files, bad files, and nil" do
581
+ it "knows the difference between good files, bad files, and nil" do
574
582
  @dummy.avatar = @bad_file
575
583
  assert ! @dummy.valid?
576
584
  @dummy.avatar = nil
@@ -586,7 +594,7 @@ class IntegrationTest < Test::Unit::TestCase
586
594
  assert ! @d2.valid?
587
595
  end
588
596
 
589
- should "be able to reload without saving and not have the file disappear" do
597
+ it "is able to reload without saving and not have the file disappear" do
590
598
  @dummy.avatar = @file
591
599
  assert @dummy.save
592
600
  @dummy.avatar = nil
@@ -595,28 +603,28 @@ class IntegrationTest < Test::Unit::TestCase
595
603
  assert_equal "5k.png", @dummy.avatar_file_name
596
604
  end
597
605
 
598
- should "have the right content type" do
606
+ it "has the right content type" do
599
607
  headers = s3_headers_for(@dummy.avatar, :original)
600
608
  assert_equal 'image/png', headers['content-type']
601
609
  end
602
610
 
603
- should "have the right style-specific headers" do
611
+ it "has the right style-specific headers" do
604
612
  headers = s3_headers_for(@dummy.avatar, :custom)
605
613
  assert_equal 'max-age=31557600', headers['cache-control']
606
614
  end
607
615
 
608
- should "have the right style-specific metadata" do
616
+ it "has the right style-specific metadata" do
609
617
  headers = s3_headers_for(@dummy.avatar, :custom)
610
618
  assert_equal 'bar', headers['x-amz-meta-foo']
611
619
  end
612
620
 
613
621
  context "with non-english character in the file name" do
614
- setup do
622
+ before do
615
623
  @file.stubs(:original_filename).returns("クリップ.png")
616
624
  @dummy.avatar = @file
617
625
  end
618
626
 
619
- should "not raise any error" do
627
+ it "does not raise any error" do
620
628
  @dummy.save!
621
629
  end
622
630
  end
@@ -624,14 +632,14 @@ class IntegrationTest < Test::Unit::TestCase
624
632
  end
625
633
 
626
634
  context "Copying attachments between models" do
627
- setup do
635
+ before do
628
636
  rebuild_model
629
637
  @file = File.new(fixture_file("5k.png"), 'rb')
630
638
  end
631
639
 
632
- teardown { @file.close }
640
+ after { @file.close }
633
641
 
634
- should "succeed when original attachment is a file" do
642
+ it "succeeds when original attachment is a file" do
635
643
  original = Dummy.new
636
644
  original.avatar = @file
637
645
  assert original.save
@@ -643,7 +651,7 @@ class IntegrationTest < Test::Unit::TestCase
643
651
  assert copy.avatar.present?
644
652
  end
645
653
 
646
- should "succeed when original attachment is empty" do
654
+ it "succeeds when original attachment is empty" do
647
655
  original = Dummy.create!
648
656
 
649
657
  copy = Dummy.new