paperclip 4.1.1 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of paperclip might be problematic. Click here for more details.

Files changed (152) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -6
  3. data/.travis.yml +4 -13
  4. data/Appraisals +0 -10
  5. data/CONTRIBUTING.md +10 -5
  6. data/Gemfile +8 -4
  7. data/NEWS +1 -1
  8. data/README.md +51 -10
  9. data/Rakefile +6 -8
  10. data/features/basic_integration.feature +5 -5
  11. data/features/step_definitions/attachment_steps.rb +4 -4
  12. data/features/step_definitions/rails_steps.rb +4 -4
  13. data/features/step_definitions/web_steps.rb +2 -2
  14. data/features/support/env.rb +2 -2
  15. data/features/support/fixtures/gemfile.txt +1 -1
  16. data/features/support/rails.rb +2 -1
  17. data/gemfiles/3.2.gemfile +5 -3
  18. data/gemfiles/4.0.gemfile +5 -3
  19. data/gemfiles/4.1.gemfile +5 -3
  20. data/lib/generators/paperclip/paperclip_generator.rb +0 -2
  21. data/lib/generators/paperclip/templates/paperclip_migration.rb.erb +1 -1
  22. data/lib/paperclip.rb +4 -1
  23. data/lib/paperclip/attachment.rb +90 -29
  24. data/lib/paperclip/content_type_detector.rb +1 -1
  25. data/lib/paperclip/geometry_detector_factory.rb +3 -1
  26. data/lib/paperclip/has_attached_file.rb +2 -1
  27. data/lib/paperclip/interpolations.rb +8 -0
  28. data/lib/paperclip/io_adapters/abstract_adapter.rb +1 -1
  29. data/lib/paperclip/io_adapters/data_uri_adapter.rb +1 -1
  30. data/lib/paperclip/io_adapters/stringio_adapter.rb +5 -11
  31. data/lib/paperclip/locales/de.yml +18 -0
  32. data/lib/paperclip/locales/es.yml +18 -0
  33. data/lib/paperclip/matchers/have_attached_file_matcher.rb +2 -1
  34. data/lib/paperclip/matchers/validate_attachment_presence_matcher.rb +2 -1
  35. data/lib/paperclip/matchers/validate_attachment_size_matcher.rb +2 -1
  36. data/lib/paperclip/media_type_spoof_detector.rb +10 -2
  37. data/lib/paperclip/storage/filesystem.rb +1 -1
  38. data/lib/paperclip/storage/s3.rb +26 -4
  39. data/lib/paperclip/style.rb +1 -1
  40. data/lib/paperclip/thumbnail.rb +6 -6
  41. data/lib/paperclip/validators.rb +5 -3
  42. data/lib/paperclip/validators/attachment_size_validator.rb +7 -3
  43. data/lib/paperclip/version.rb +1 -1
  44. data/lib/tasks/paperclip.rake +1 -2
  45. data/paperclip.gemspec +5 -3
  46. data/shoulda_macros/paperclip.rb +0 -1
  47. data/{test → spec}/database.yml +0 -0
  48. data/spec/paperclip/attachment_definitions_spec.rb +13 -0
  49. data/{test/attachment_processing_test.rb → spec/paperclip/attachment_processing_spec.rb} +20 -21
  50. data/{test/attachment_registry_test.rb → spec/paperclip/attachment_registry_spec.rb} +10 -11
  51. data/{test/attachment_test.rb → spec/paperclip/attachment_spec.rb} +367 -360
  52. data/{test/content_type_detector_test.rb → spec/paperclip/content_type_detector_spec.rb} +8 -8
  53. data/{test/file_command_content_type_detector_test.rb → spec/paperclip/file_command_content_type_detector_spec.rb} +5 -5
  54. data/spec/paperclip/filename_cleaner_spec.rb +14 -0
  55. data/spec/paperclip/geometry_detector_spec.rb +39 -0
  56. data/{test/geometry_parser_test.rb → spec/paperclip/geometry_parser_spec.rb} +27 -27
  57. data/{test/geometry_test.rb → spec/paperclip/geometry_spec.rb} +49 -51
  58. data/{test/has_attached_file_test.rb → spec/paperclip/has_attached_file_spec.rb} +18 -27
  59. data/{test/integration_test.rb → spec/paperclip/integration_spec.rb} +134 -126
  60. data/{test/interpolations_test.rb → spec/paperclip/interpolations_spec.rb} +54 -40
  61. data/{test/io_adapters/abstract_adapter_test.rb → spec/paperclip/io_adapters/abstract_adapter_spec.rb} +21 -10
  62. data/{test/io_adapters/attachment_adapter_test.rb → spec/paperclip/io_adapters/attachment_adapter_spec.rb} +27 -29
  63. data/{test/io_adapters/data_uri_adapter_test.rb → spec/paperclip/io_adapters/data_uri_adapter_spec.rb} +22 -18
  64. data/spec/paperclip/io_adapters/empty_string_adapter_spec.rb +17 -0
  65. data/{test/io_adapters/file_adapter_test.rb → spec/paperclip/io_adapters/file_adapter_spec.rb} +32 -28
  66. data/{test/io_adapters/http_url_proxy_adapter_test.rb → spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb} +22 -22
  67. data/spec/paperclip/io_adapters/identity_adapter_spec.rb +8 -0
  68. data/{test/io_adapters/nil_adapter_test.rb → spec/paperclip/io_adapters/nil_adapter_spec.rb} +7 -7
  69. data/{test/io_adapters/registry_test.rb → spec/paperclip/io_adapters/registry_spec.rb} +10 -7
  70. data/{test/io_adapters/stringio_adapter_test.rb → spec/paperclip/io_adapters/stringio_adapter_spec.rb} +16 -17
  71. data/{test/io_adapters/uploaded_file_adapter_test.rb → spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb} +41 -41
  72. data/{test/io_adapters/uri_adapter_test.rb → spec/paperclip/io_adapters/uri_adapter_spec.rb} +22 -22
  73. data/spec/paperclip/matchers/have_attached_file_matcher_spec.rb +19 -0
  74. data/spec/paperclip/matchers/validate_attachment_content_type_matcher_spec.rb +99 -0
  75. data/spec/paperclip/matchers/validate_attachment_presence_matcher_spec.rb +69 -0
  76. data/spec/paperclip/matchers/validate_attachment_size_matcher_spec.rb +88 -0
  77. data/{test/media_type_spoof_detector_test.rb → spec/paperclip/media_type_spoof_detector_spec.rb} +13 -8
  78. data/spec/paperclip/meta_class_spec.rb +30 -0
  79. data/spec/paperclip/paperclip_missing_attachment_styles_spec.rb +84 -0
  80. data/{test/paperclip_test.rb → spec/paperclip/paperclip_spec.rb} +47 -47
  81. data/{test/plural_cache_test.rb → spec/paperclip/plural_cache_spec.rb} +6 -6
  82. data/{test/processor_test.rb → spec/paperclip/processor_spec.rb} +5 -5
  83. data/{test/rake_test.rb → spec/paperclip/rake_spec.rb} +15 -15
  84. data/spec/paperclip/schema_spec.rb +206 -0
  85. data/{test/storage/filesystem_test.rb → spec/paperclip/storage/filesystem_spec.rb} +18 -18
  86. data/{test/storage/fog_test.rb → spec/paperclip/storage/fog_spec.rb} +145 -140
  87. data/spec/paperclip/storage/s3_live_spec.rb +182 -0
  88. data/spec/paperclip/storage/s3_spec.rb +1475 -0
  89. data/spec/paperclip/style_spec.rb +255 -0
  90. data/spec/paperclip/tempfile_factory_spec.rb +29 -0
  91. data/{test/thumbnail_test.rb → spec/paperclip/thumbnail_spec.rb} +107 -107
  92. data/{test/url_generator_test.rb → spec/paperclip/url_generator_spec.rb} +55 -56
  93. data/spec/paperclip/validators/attachment_content_type_validator_spec.rb +322 -0
  94. data/spec/paperclip/validators/attachment_file_name_validator_spec.rb +160 -0
  95. data/{test/validators/attachment_presence_validator_test.rb → spec/paperclip/validators/attachment_presence_validator_spec.rb} +19 -19
  96. data/{test/validators/attachment_size_validator_test.rb → spec/paperclip/validators/attachment_size_validator_spec.rb} +65 -58
  97. data/{test/validators/media_type_spoof_detection_validator_test.rb → spec/paperclip/validators/media_type_spoof_detection_validator_spec.rb} +8 -8
  98. data/spec/paperclip/validators_spec.rb +164 -0
  99. data/spec/spec_helper.rb +40 -0
  100. data/spec/support/assertions.rb +71 -0
  101. data/spec/support/fake_model.rb +21 -0
  102. data/spec/support/fake_rails.rb +12 -0
  103. data/{test → spec/support}/fixtures/12k.png +0 -0
  104. data/{test → spec/support}/fixtures/50x50.png +0 -0
  105. data/{test → spec/support}/fixtures/5k.png +0 -0
  106. data/{test → spec/support}/fixtures/animated +0 -0
  107. data/{test → spec/support}/fixtures/animated.gif +0 -0
  108. data/{test → spec/support}/fixtures/animated.unknown +0 -0
  109. data/{test → spec/support}/fixtures/bad.png +0 -0
  110. data/{test → spec/support}/fixtures/empty.html +0 -0
  111. data/{test → spec/support}/fixtures/fog.yml +0 -0
  112. data/{test → spec/support}/fixtures/rotated.jpg +0 -0
  113. data/{test → spec/support}/fixtures/s3.yml +0 -0
  114. data/spec/support/fixtures/spaced file.jpg +0 -0
  115. data/test/fixtures/spaced file.png b/data/spec/support/fixtures/spaced → file.png +0 -0
  116. data/{test → spec/support}/fixtures/text.txt +0 -0
  117. data/{test → spec/support}/fixtures/twopage.pdf +0 -0
  118. data/{test → spec/support}/fixtures/uppercase.PNG +0 -0
  119. data/spec/support/matchers/accept.rb +5 -0
  120. data/spec/support/matchers/exist.rb +5 -0
  121. data/{test → spec}/support/mock_attachment.rb +0 -0
  122. data/{test → spec}/support/mock_interpolator.rb +0 -0
  123. data/{test → spec}/support/mock_model.rb +0 -0
  124. data/{test → spec}/support/mock_url_generator_builder.rb +0 -0
  125. data/spec/support/model_reconstruction.rb +60 -0
  126. data/spec/support/rails_helpers.rb +7 -0
  127. data/spec/support/test_data.rb +13 -0
  128. data/spec/support/version_helper.rb +9 -0
  129. metadata +256 -210
  130. data/gemfiles/3.0.gemfile +0 -11
  131. data/gemfiles/3.1.gemfile +0 -11
  132. data/test/attachment_definitions_test.rb +0 -13
  133. data/test/filename_cleaner_test.rb +0 -14
  134. data/test/generator_test.rb +0 -84
  135. data/test/geometry_detector_test.rb +0 -24
  136. data/test/helper.rb +0 -239
  137. data/test/io_adapters/empty_string_adapter_test.rb +0 -18
  138. data/test/io_adapters/identity_adapter_test.rb +0 -8
  139. data/test/matchers/have_attached_file_matcher_test.rb +0 -25
  140. data/test/matchers/validate_attachment_content_type_matcher_test.rb +0 -111
  141. data/test/matchers/validate_attachment_presence_matcher_test.rb +0 -70
  142. data/test/matchers/validate_attachment_size_matcher_test.rb +0 -87
  143. data/test/meta_class_test.rb +0 -32
  144. data/test/paperclip_missing_attachment_styles_test.rb +0 -90
  145. data/test/schema_test.rb +0 -206
  146. data/test/storage/s3_live_test.rb +0 -179
  147. data/test/storage/s3_test.rb +0 -1357
  148. data/test/style_test.rb +0 -251
  149. data/test/tempfile_factory_test.rb +0 -29
  150. data/test/validators/attachment_content_type_validator_test.rb +0 -324
  151. data/test/validators/attachment_file_name_validator_test.rb +0 -162
  152. data/test/validators_test.rb +0 -101
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+ require 'paperclip/matchers'
3
+
4
+ describe Paperclip::Shoulda::Matchers::ValidateAttachmentPresenceMatcher do
5
+ extend Paperclip::Shoulda::Matchers
6
+
7
+ before do
8
+ reset_table("dummies") do |d|
9
+ d.string :avatar_file_name
10
+ end
11
+ reset_class "Dummy"
12
+ Dummy.has_attached_file :avatar
13
+ Dummy.do_not_validate_attachment_file_type :avatar
14
+ end
15
+
16
+ it "rejects a class with no validation" do
17
+ expect(matcher).to_not accept(Dummy)
18
+ end
19
+
20
+ it "accepts a class with a matching validation" do
21
+ Dummy.validates_attachment_presence :avatar
22
+ expect(matcher).to accept(Dummy)
23
+ end
24
+
25
+ it "accepts an instance with other attachment validations" do
26
+ reset_table("dummies") do |d|
27
+ d.string :avatar_file_name
28
+ d.string :avatar_content_type
29
+ end
30
+ Dummy.class_eval do
31
+ validates_attachment_presence :avatar
32
+ validates_attachment_content_type :avatar, content_type: 'image/gif'
33
+ end
34
+ dummy = Dummy.new
35
+
36
+ dummy.avatar = File.new fixture_file('5k.png')
37
+
38
+ expect(matcher).to accept(dummy)
39
+ end
40
+
41
+ context "using an :if to control the validation" do
42
+ before do
43
+ Dummy.class_eval do
44
+ validates_attachment_presence :avatar, if: :go
45
+ attr_accessor :go
46
+ end
47
+ end
48
+
49
+ it "runs the validation if the control is true" do
50
+ dummy = Dummy.new
51
+ dummy.avatar = nil
52
+ dummy.go = true
53
+ expect(matcher).to accept(dummy)
54
+ end
55
+
56
+ it "does not run the validation if the control is false" do
57
+ dummy = Dummy.new
58
+ dummy.avatar = nil
59
+ dummy.go = false
60
+ expect(matcher).to_not accept(dummy)
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ def matcher
67
+ self.class.validate_attachment_presence(:avatar)
68
+ end
69
+ end
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+ require 'paperclip/matchers'
3
+
4
+ describe Paperclip::Shoulda::Matchers::ValidateAttachmentSizeMatcher do
5
+ extend Paperclip::Shoulda::Matchers
6
+
7
+ before do
8
+ reset_table("dummies") do |d|
9
+ d.string :avatar_file_name
10
+ d.integer :avatar_file_size
11
+ end
12
+ reset_class "Dummy"
13
+ Dummy.do_not_validate_attachment_file_type :avatar
14
+ Dummy.has_attached_file :avatar
15
+ end
16
+
17
+ context "Limiting size" do
18
+ it "rejects a class with no validation" do
19
+ expect(matcher.in(256..1024)).to_not accept(Dummy)
20
+ end
21
+
22
+ it "rejects a class with a validation that's too high" do
23
+ Dummy.validates_attachment_size :avatar, in: 256..2048
24
+ expect(matcher.in(256..1024)).to_not accept(Dummy)
25
+ end
26
+
27
+ it "accepts a class with a validation that's too low" do
28
+ Dummy.validates_attachment_size :avatar, in: 0..1024
29
+ expect(matcher.in(256..1024)).to_not accept(Dummy)
30
+ end
31
+
32
+ it "accepts a class with a validation that matches" do
33
+ Dummy.validates_attachment_size :avatar, in: 256..1024
34
+ expect(matcher.in(256..1024)).to accept(Dummy)
35
+ end
36
+ end
37
+
38
+ context "allowing anything" do
39
+ it "given a class with an upper limit" do
40
+ Dummy.validates_attachment_size :avatar, less_than: 1
41
+ expect(matcher).to accept(Dummy)
42
+ end
43
+
44
+ it "given a class with a lower limit" do
45
+ Dummy.validates_attachment_size :avatar, greater_than: 1
46
+ expect(matcher).to accept(Dummy)
47
+ end
48
+ end
49
+
50
+ context "using an :if to control the validation" do
51
+ before do
52
+ Dummy.class_eval do
53
+ validates_attachment_size :avatar, greater_than: 1024, if: :go
54
+ attr_accessor :go
55
+ end
56
+ end
57
+
58
+ it "run the validation if the control is true" do
59
+ dummy = Dummy.new
60
+ dummy.go = true
61
+ expect(matcher.greater_than(1024)).to accept(dummy)
62
+ end
63
+
64
+ it "not run the validation if the control is false" do
65
+ dummy = Dummy.new
66
+ dummy.go = false
67
+ expect(matcher.greater_than(1024)).to_not accept(dummy)
68
+ end
69
+ end
70
+
71
+ context "post processing" do
72
+ before do
73
+ Dummy.validates_attachment_size :avatar, greater_than: 1024
74
+ end
75
+
76
+ it "be skipped" do
77
+ dummy = Dummy.new
78
+ dummy.avatar.expects(:post_process).never
79
+ expect(matcher.greater_than(1024)).to accept(dummy)
80
+ end
81
+ end
82
+
83
+ private
84
+
85
+ def matcher
86
+ self.class.validate_attachment_size(:avatar)
87
+ end
88
+ end
@@ -1,32 +1,37 @@
1
- require './test/helper'
1
+ require 'spec_helper'
2
2
 
3
- class MediaTypeSpoofDetectorTest < Test::Unit::TestCase
4
- should 'reject a file that is named .html and identifies as PNG' do
3
+ describe Paperclip::MediaTypeSpoofDetector do
4
+ it 'rejects a file that is named .html and identifies as PNG' do
5
5
  file = File.open(fixture_file("5k.png"))
6
6
  assert Paperclip::MediaTypeSpoofDetector.using(file, "5k.html").spoofed?
7
7
  end
8
8
 
9
- should 'not reject a file that is named .jpg and identifies as PNG' do
9
+ it 'does not reject a file that is named .jpg and identifies as PNG' do
10
10
  file = File.open(fixture_file("5k.png"))
11
11
  assert ! Paperclip::MediaTypeSpoofDetector.using(file, "5k.jpg").spoofed?
12
12
  end
13
13
 
14
- should 'not reject a file that is named .html and identifies as HTML' do
14
+ it 'does not reject a file that is named .html and identifies as HTML' do
15
15
  file = File.open(fixture_file("empty.html"))
16
16
  assert ! Paperclip::MediaTypeSpoofDetector.using(file, "empty.html").spoofed?
17
17
  end
18
18
 
19
- should 'not reject a file that does not have a name' do
19
+ it 'does not reject a file that does not have a name' do
20
20
  file = File.open(fixture_file("empty.html"))
21
21
  assert ! Paperclip::MediaTypeSpoofDetector.using(file, "").spoofed?
22
22
  end
23
23
 
24
- should 'not reject when the supplied file is an IOAdapter' do
24
+ it 'does not reject a file that does have an extension' do
25
+ file = File.open(fixture_file("empty.html"))
26
+ assert ! Paperclip::MediaTypeSpoofDetector.using(file, "data").spoofed?
27
+ end
28
+
29
+ it 'does not reject when the supplied file is an IOAdapter' do
25
30
  adapter = Paperclip.io_adapters.for(File.new(fixture_file("5k.png")))
26
31
  assert ! Paperclip::MediaTypeSpoofDetector.using(adapter, adapter.original_filename).spoofed?
27
32
  end
28
33
 
29
- should 'not reject when the extension => content_type is in :content_type_mappings' do
34
+ it 'does not reject when the extension => content_type is in :content_type_mappings' do
30
35
  begin
31
36
  Paperclip.options[:content_type_mappings] = { pem: "text/plain" }
32
37
  file = Tempfile.open(["test", ".PEM"])
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Metaclasses' do
4
+ context "A meta-class of dummy" do
5
+ if active_support_version >= "4.1" || ruby_version < "2.1"
6
+ before do
7
+ rebuild_model("Dummy")
8
+ reset_class("Dummy")
9
+ end
10
+
11
+ it "is able to use Paperclip like a normal class" do
12
+ @dummy = Dummy.new
13
+
14
+ assert_nothing_raised do
15
+ rebuild_meta_class_of(@dummy)
16
+ end
17
+ end
18
+
19
+ it "works like any other instance" do
20
+ @dummy = Dummy.new
21
+ rebuild_meta_class_of(@dummy)
22
+
23
+ assert_nothing_raised do
24
+ @dummy.avatar = File.new(fixture_file("5k.png"), 'rb')
25
+ end
26
+ assert @dummy.save
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Missing Attachment Styles' do
4
+ before do
5
+ Paperclip::AttachmentRegistry.clear
6
+ end
7
+
8
+ after do
9
+ File.unlink(Paperclip.registered_attachments_styles_path) rescue nil
10
+ end
11
+
12
+ it "enables to get and set path to registered styles file" do
13
+ assert_equal ROOT.join('tmp/public/system/paperclip_attachments.yml').to_s, Paperclip.registered_attachments_styles_path
14
+ Paperclip.registered_attachments_styles_path = '/tmp/config/paperclip_attachments.yml'
15
+ assert_equal '/tmp/config/paperclip_attachments.yml', Paperclip.registered_attachments_styles_path
16
+ Paperclip.registered_attachments_styles_path = nil
17
+ assert_equal ROOT.join('tmp/public/system/paperclip_attachments.yml').to_s, Paperclip.registered_attachments_styles_path
18
+ end
19
+
20
+ it "is able to get current attachment styles" do
21
+ assert_equal Hash.new, Paperclip.send(:current_attachments_styles)
22
+ rebuild_model styles: {croppable: '600x600>', big: '1000x1000>'}
23
+ expected_hash = { Dummy: {avatar: [:big, :croppable]}}
24
+ assert_equal expected_hash, Paperclip.send(:current_attachments_styles)
25
+ end
26
+
27
+ it "is able to save current attachment styles for further comparison" do
28
+ rebuild_model styles: {croppable: '600x600>', big: '1000x1000>'}
29
+ Paperclip.save_current_attachments_styles!
30
+ expected_hash = { Dummy: {avatar: [:big, :croppable]}}
31
+ assert_equal expected_hash, YAML.load_file(Paperclip.registered_attachments_styles_path)
32
+ end
33
+
34
+ it "is able to read registered attachment styles from file" do
35
+ rebuild_model styles: {croppable: '600x600>', big: '1000x1000>'}
36
+ Paperclip.save_current_attachments_styles!
37
+ expected_hash = { Dummy: {avatar: [:big, :croppable]}}
38
+ assert_equal expected_hash, Paperclip.send(:get_registered_attachments_styles)
39
+ end
40
+
41
+ it "is able to calculate differences between registered styles and current styles" do
42
+ rebuild_model styles: {croppable: '600x600>', big: '1000x1000>'}
43
+ Paperclip.save_current_attachments_styles!
44
+ rebuild_model styles: {thumb: 'x100', export: 'x400>', croppable: '600x600>', big: '1000x1000>'}
45
+ expected_hash = { Dummy: {avatar: [:export, :thumb]} }
46
+ assert_equal expected_hash, Paperclip.missing_attachments_styles
47
+
48
+ ActiveRecord::Base.connection.create_table :books, force: true
49
+ class ::Book < ActiveRecord::Base
50
+ has_attached_file :cover, styles: {small: 'x100', large: '1000x1000>'}
51
+ has_attached_file :sample, styles: {thumb: 'x100'}
52
+ end
53
+
54
+ expected_hash = {
55
+ Dummy: {avatar: [:export, :thumb]},
56
+ Book: {sample: [:thumb], cover: [:large, :small]}
57
+ }
58
+ assert_equal expected_hash, Paperclip.missing_attachments_styles
59
+ Paperclip.save_current_attachments_styles!
60
+ assert_equal Hash.new, Paperclip.missing_attachments_styles
61
+ end
62
+
63
+ it "is able to calculate differences when a new attachment is added to a model" do
64
+ rebuild_model styles: {croppable: '600x600>', big: '1000x1000>'}
65
+ Paperclip.save_current_attachments_styles!
66
+
67
+ class ::Dummy
68
+ has_attached_file :photo, styles: {small: 'x100', large: '1000x1000>'}
69
+ end
70
+
71
+ expected_hash = {
72
+ Dummy: {photo: [:large, :small]}
73
+ }
74
+ assert_equal expected_hash, Paperclip.missing_attachments_styles
75
+ Paperclip.save_current_attachments_styles!
76
+ assert_equal Hash.new, Paperclip.missing_attachments_styles
77
+ end
78
+
79
+ # It's impossible to build styles hash without loading from database whole bunch of records
80
+ it "skips lambda-styles" do
81
+ rebuild_model styles: lambda{ |attachment| attachment.instance.other == 'a' ? {thumb: "50x50#"} : {large: "400x400"} }
82
+ assert_equal Hash.new, Paperclip.send(:current_attachments_styles)
83
+ end
84
+ end
@@ -1,29 +1,29 @@
1
- require './test/helper'
1
+ require 'spec_helper'
2
2
 
3
- class PaperclipTest < Test::Unit::TestCase
4
- context "Calling Paperclip.run" do
5
- setup do
3
+ describe Paperclip do
4
+ context ".run" do
5
+ before do
6
6
  Paperclip.options[:log_command] = false
7
7
  Cocaine::CommandLine.expects(:new).with("convert", "stuff", {}).returns(stub(:run))
8
8
  @original_command_line_path = Cocaine::CommandLine.path
9
9
  end
10
10
 
11
- teardown do
11
+ after do
12
12
  Paperclip.options[:log_command] = true
13
13
  Cocaine::CommandLine.path = @original_command_line_path
14
14
  end
15
15
 
16
- should "run the command with Cocaine" do
16
+ it "runs the command with Cocaine" do
17
17
  Paperclip.run("convert", "stuff")
18
18
  end
19
19
 
20
- should "save Cocaine::CommandLine.path that set before" do
20
+ it "saves Cocaine::CommandLine.path that set before" do
21
21
  Cocaine::CommandLine.path = "/opt/my_app/bin"
22
22
  Paperclip.run("convert", "stuff")
23
23
  assert_equal [Cocaine::CommandLine.path].flatten.include?("/opt/my_app/bin"), true
24
24
  end
25
25
 
26
- should "not duplicate Cocaine::CommandLine.path on multiple runs" do
26
+ it "does not duplicate Cocaine::CommandLine.path on multiple runs" do
27
27
  Cocaine::CommandLine.expects(:new).with("convert", "more_stuff", {}).returns(stub(:run))
28
28
  Cocaine::CommandLine.path = nil
29
29
  Paperclip.options[:command_path] = "/opt/my_app/bin"
@@ -33,7 +33,7 @@ class PaperclipTest < Test::Unit::TestCase
33
33
  end
34
34
  end
35
35
 
36
- should 'not raise errors when doing a lot of running' do
36
+ it 'does not raise errors when doing a lot of running' do
37
37
  Paperclip.options[:command_path] = ["/usr/local/bin"] * 1024
38
38
  Cocaine::CommandLine.path = "/something/else"
39
39
  100.times do |x|
@@ -42,80 +42,80 @@ class PaperclipTest < Test::Unit::TestCase
42
42
  end
43
43
 
44
44
  context "Calling Paperclip.log without options[:logger] set" do
45
- setup do
45
+ before do
46
46
  Paperclip.logger = nil
47
47
  Paperclip.options[:logger] = nil
48
48
  end
49
49
 
50
- teardown do
50
+ after do
51
51
  Paperclip.options[:logger] = ActiveRecord::Base.logger
52
52
  Paperclip.logger = ActiveRecord::Base.logger
53
53
  end
54
54
 
55
- should "not raise an error when log is called" do
55
+ it "does not raise an error when log is called" do
56
56
  silence_stream(STDOUT) do
57
57
  Paperclip.log('something')
58
58
  end
59
59
  end
60
60
  end
61
61
  context "Calling Paperclip.run with a logger" do
62
- should "pass the defined logger if :log_command is set" do
62
+ it "passes the defined logger if :log_command is set" do
63
63
  Paperclip.options[:log_command] = true
64
- Cocaine::CommandLine.expects(:new).with("convert", "stuff", :logger => Paperclip.logger).returns(stub(:run))
64
+ Cocaine::CommandLine.expects(:new).with("convert", "stuff", logger: Paperclip.logger).returns(stub(:run))
65
65
  Paperclip.run("convert", "stuff")
66
66
  end
67
67
  end
68
68
 
69
69
  context "Paperclip.each_instance_with_attachment" do
70
- setup do
70
+ before do
71
71
  @file = File.new(fixture_file("5k.png"), 'rb')
72
- d1 = Dummy.create(:avatar => @file)
72
+ d1 = Dummy.create(avatar: @file)
73
73
  d2 = Dummy.create
74
- d3 = Dummy.create(:avatar => @file)
74
+ d3 = Dummy.create(avatar: @file)
75
75
  @expected = [d1, d3]
76
76
  end
77
77
 
78
- teardown { @file.close }
78
+ after { @file.close }
79
79
 
80
- should "yield every instance of a model that has an attachment" do
80
+ it "yields every instance of a model that has an attachment" do
81
81
  actual = []
82
82
  Paperclip.each_instance_with_attachment("Dummy", "avatar") do |instance|
83
83
  actual << instance
84
84
  end
85
- assert_same_elements @expected, actual
85
+ expect(actual).to match_array @expected
86
86
  end
87
87
  end
88
88
 
89
- should "raise when sent #processor and the name of a class that doesn't exist" do
90
- assert_raises(NameError){ Paperclip.processor(:boogey_man) }
89
+ it "raises when sent #processor and the name of a class that doesn't exist" do
90
+ assert_raises(LoadError){ Paperclip.processor(:boogey_man) }
91
91
  end
92
92
 
93
- should "return a class when sent #processor and the name of a class under Paperclip" do
93
+ it "returns a class when sent #processor and the name of a class under Paperclip" do
94
94
  assert_equal ::Paperclip::Thumbnail, Paperclip.processor(:thumbnail)
95
95
  end
96
96
 
97
- should "get a class from a namespaced class name" do
97
+ it "gets a class from a namespaced class name" do
98
98
  class ::One; class Two; end; end
99
99
  assert_equal ::One::Two, Paperclip.class_for("One::Two")
100
100
  end
101
101
 
102
- should "raise when class doesn't exist in specified namespace" do
102
+ it "raises when class doesn't exist in specified namespace" do
103
103
  class ::Three; end
104
104
  class ::Four; end
105
- assert_raise NameError do
105
+ assert_raises NameError do
106
106
  Paperclip.class_for("Three::Four")
107
107
  end
108
108
  end
109
109
 
110
110
  context "An ActiveRecord model with an 'avatar' attachment" do
111
- setup do
112
- rebuild_model :path => "tmp/:class/omg/:style.:extension"
111
+ before do
112
+ rebuild_model path: "tmp/:class/omg/:style.:extension"
113
113
  @file = File.new(fixture_file("5k.png"), 'rb')
114
114
  end
115
115
 
116
- teardown { @file.close }
116
+ after { @file.close }
117
117
 
118
- should "not error when trying to also create a 'blah' attachment" do
118
+ it "does not error when trying to also create a 'blah' attachment" do
119
119
  assert_nothing_raised do
120
120
  Dummy.class_eval do
121
121
  has_attached_file :blah
@@ -125,22 +125,22 @@ class PaperclipTest < Test::Unit::TestCase
125
125
 
126
126
  if using_protected_attributes?
127
127
  context "that is attr_protected" do
128
- setup do
128
+ before do
129
129
  Dummy.class_eval do
130
130
  attr_protected :avatar
131
131
  end
132
132
  @dummy = Dummy.new
133
133
  end
134
134
 
135
- should "not assign the avatar on mass-set" do
136
- @dummy.attributes = { :other => "I'm set!",
137
- :avatar => @file }
135
+ it "does not assign the avatar on mass-set" do
136
+ @dummy.attributes = { other: "I'm set!",
137
+ avatar: @file }
138
138
 
139
139
  assert_equal "I'm set!", @dummy.other
140
140
  assert ! @dummy.avatar?
141
141
  end
142
142
 
143
- should "still allow assigment on normal set" do
143
+ it "allows assigment on normal set" do
144
144
  @dummy.other = "I'm set!"
145
145
  @dummy.avatar = @file
146
146
 
@@ -151,42 +151,42 @@ class PaperclipTest < Test::Unit::TestCase
151
151
  end
152
152
 
153
153
  context "with a subclass" do
154
- setup do
154
+ before do
155
155
  class ::SubDummy < Dummy; end
156
156
  end
157
157
 
158
- should "be able to use the attachment from the subclass" do
158
+ it "is able to use the attachment from the subclass" do
159
159
  assert_nothing_raised do
160
- @subdummy = SubDummy.create(:avatar => @file)
160
+ @subdummy = SubDummy.create(avatar: @file)
161
161
  end
162
162
  end
163
163
 
164
- teardown do
164
+ after do
165
165
  SubDummy.delete_all
166
166
  Object.send(:remove_const, "SubDummy") rescue nil
167
167
  end
168
168
  end
169
169
 
170
- should "have an #avatar method" do
170
+ it "has an avatar getter method" do
171
171
  assert Dummy.new.respond_to?(:avatar)
172
172
  end
173
173
 
174
- should "have an #avatar= method" do
174
+ it "has an avatar setter method" do
175
175
  assert Dummy.new.respond_to?(:avatar=)
176
176
  end
177
177
 
178
178
  context "that is valid" do
179
- setup do
179
+ before do
180
180
  @dummy = Dummy.new
181
181
  @dummy.avatar = @file
182
182
  end
183
183
 
184
- should "be valid" do
184
+ it "is valid" do
185
185
  assert @dummy.valid?
186
186
  end
187
187
  end
188
188
 
189
- should "not have Attachment in the ActiveRecord::Base namespace" do
189
+ it "does not have Attachment in the ActiveRecord::Base namespace" do
190
190
  assert_raises(NameError) do
191
191
  ActiveRecord::Base::Attachment
192
192
  end
@@ -194,7 +194,7 @@ class PaperclipTest < Test::Unit::TestCase
194
194
  end
195
195
 
196
196
  context "configuring a custom processor" do
197
- setup do
197
+ before do
198
198
  @freedom_processor = Class.new do
199
199
  def make(file, options = {}, attachment = nil)
200
200
  file
@@ -206,11 +206,11 @@ class PaperclipTest < Test::Unit::TestCase
206
206
  end
207
207
  end
208
208
 
209
- should "be able to find the custom processor" do
209
+ it "is able to find the custom processor" do
210
210
  assert_equal @freedom_processor, Paperclip.processor(:freedom)
211
211
  end
212
212
 
213
- teardown do
213
+ after do
214
214
  Paperclip.clear_processors!
215
215
  end
216
216
  end