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