paperclip 3.5.4 → 5.3.0

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