jr-paperclip 8.0.2 → 8.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. checksums.yaml +4 -4
  2. data/NEWS +4 -0
  3. data/lib/paperclip/version.rb +1 -1
  4. metadata +3 -247
  5. data/.github/FUNDING.yml +0 -3
  6. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -18
  7. data/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  8. data/.github/workflows/reviewdog.yml +0 -23
  9. data/.github/workflows/tests.yml +0 -56
  10. data/.gitignore +0 -19
  11. data/.qlty/.gitignore +0 -7
  12. data/.qlty/qlty.toml +0 -89
  13. data/Appraisals +0 -29
  14. data/Gemfile +0 -18
  15. data/bin/console +0 -11
  16. data/features/basic_integration.feature +0 -112
  17. data/features/migration.feature +0 -29
  18. data/features/rake_tasks.feature +0 -62
  19. data/features/step_definitions/attachment_steps.rb +0 -138
  20. data/features/step_definitions/html_steps.rb +0 -15
  21. data/features/step_definitions/rails_steps.rb +0 -271
  22. data/features/step_definitions/s3_steps.rb +0 -16
  23. data/features/step_definitions/web_steps.rb +0 -106
  24. data/features/support/env.rb +0 -12
  25. data/features/support/file_helpers.rb +0 -34
  26. data/features/support/fixtures/boot_config.txt +0 -15
  27. data/features/support/fixtures/gemfile.txt +0 -5
  28. data/features/support/fixtures/preinitializer.txt +0 -20
  29. data/features/support/paths.rb +0 -28
  30. data/features/support/rails.rb +0 -39
  31. data/features/support/selectors.rb +0 -19
  32. data/features/support/webmock_setup.rb +0 -8
  33. data/gemfiles/7.0.gemfile +0 -21
  34. data/gemfiles/7.1.gemfile +0 -21
  35. data/gemfiles/7.2.gemfile +0 -21
  36. data/gemfiles/8.0.gemfile +0 -21
  37. data/gemfiles/8.1.gemfile +0 -21
  38. data/paperclip.gemspec +0 -52
  39. data/spec/database.yml +0 -4
  40. data/spec/paperclip/attachment_definitions_spec.rb +0 -313
  41. data/spec/paperclip/attachment_processing_spec.rb +0 -79
  42. data/spec/paperclip/attachment_registry_spec.rb +0 -158
  43. data/spec/paperclip/attachment_spec.rb +0 -1617
  44. data/spec/paperclip/content_type_detector_spec.rb +0 -58
  45. data/spec/paperclip/file_command_content_type_detector_spec.rb +0 -40
  46. data/spec/paperclip/filename_cleaner_spec.rb +0 -13
  47. data/spec/paperclip/geometry_detector_spec.rb +0 -96
  48. data/spec/paperclip/geometry_parser_spec.rb +0 -73
  49. data/spec/paperclip/geometry_spec.rb +0 -270
  50. data/spec/paperclip/glue_spec.rb +0 -63
  51. data/spec/paperclip/has_attached_file_spec.rb +0 -78
  52. data/spec/paperclip/helpers_spec.rb +0 -49
  53. data/spec/paperclip/integration_spec.rb +0 -702
  54. data/spec/paperclip/interpolations_spec.rb +0 -270
  55. data/spec/paperclip/io_adapters/abstract_adapter_spec.rb +0 -160
  56. data/spec/paperclip/io_adapters/attachment_adapter_spec.rb +0 -167
  57. data/spec/paperclip/io_adapters/data_uri_adapter_spec.rb +0 -88
  58. data/spec/paperclip/io_adapters/empty_string_adapter_spec.rb +0 -17
  59. data/spec/paperclip/io_adapters/file_adapter_spec.rb +0 -134
  60. data/spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb +0 -142
  61. data/spec/paperclip/io_adapters/identity_adapter_spec.rb +0 -8
  62. data/spec/paperclip/io_adapters/nil_adapter_spec.rb +0 -25
  63. data/spec/paperclip/io_adapters/registry_spec.rb +0 -35
  64. data/spec/paperclip/io_adapters/stringio_adapter_spec.rb +0 -64
  65. data/spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb +0 -146
  66. data/spec/paperclip/io_adapters/uri_adapter_spec.rb +0 -231
  67. data/spec/paperclip/lazy_thumbnail_compatibility_spec.rb +0 -266
  68. data/spec/paperclip/matchers/have_attached_file_matcher_spec.rb +0 -19
  69. data/spec/paperclip/matchers/validate_attachment_content_type_matcher_spec.rb +0 -108
  70. data/spec/paperclip/matchers/validate_attachment_presence_matcher_spec.rb +0 -69
  71. data/spec/paperclip/matchers/validate_attachment_size_matcher_spec.rb +0 -88
  72. data/spec/paperclip/media_type_spoof_detector_spec.rb +0 -126
  73. data/spec/paperclip/meta_class_spec.rb +0 -30
  74. data/spec/paperclip/migration_guide_example_spec.rb +0 -44
  75. data/spec/paperclip/paperclip_missing_attachment_styles_spec.rb +0 -88
  76. data/spec/paperclip/paperclip_spec.rb +0 -196
  77. data/spec/paperclip/plural_cache_spec.rb +0 -37
  78. data/spec/paperclip/processor_helpers_spec.rb +0 -57
  79. data/spec/paperclip/processor_spec.rb +0 -60
  80. data/spec/paperclip/rails_environment_spec.rb +0 -30
  81. data/spec/paperclip/rake_spec.rb +0 -103
  82. data/spec/paperclip/schema_spec.rb +0 -298
  83. data/spec/paperclip/storage/filesystem_spec.rb +0 -102
  84. data/spec/paperclip/storage/fog_spec.rb +0 -606
  85. data/spec/paperclip/storage/s3_live_spec.rb +0 -188
  86. data/spec/paperclip/storage/s3_spec.rb +0 -1974
  87. data/spec/paperclip/style_spec.rb +0 -309
  88. data/spec/paperclip/tempfile_factory_spec.rb +0 -33
  89. data/spec/paperclip/tempfile_spec.rb +0 -35
  90. data/spec/paperclip/thumbnail_custom_options_spec.rb +0 -225
  91. data/spec/paperclip/thumbnail_loader_options_spec.rb +0 -53
  92. data/spec/paperclip/thumbnail_security_spec.rb +0 -42
  93. data/spec/paperclip/thumbnail_spec.rb +0 -1488
  94. data/spec/paperclip/url_generator_spec.rb +0 -231
  95. data/spec/paperclip/validators/attachment_content_type_validator_spec.rb +0 -410
  96. data/spec/paperclip/validators/attachment_file_name_validator_spec.rb +0 -249
  97. data/spec/paperclip/validators/attachment_presence_validator_spec.rb +0 -85
  98. data/spec/paperclip/validators/attachment_size_validator_spec.rb +0 -325
  99. data/spec/paperclip/validators/media_type_spoof_detection_validator_spec.rb +0 -48
  100. data/spec/paperclip/validators_spec.rb +0 -179
  101. data/spec/spec_helper.rb +0 -52
  102. data/spec/support/assertions.rb +0 -84
  103. data/spec/support/fake_model.rb +0 -24
  104. data/spec/support/fake_rails.rb +0 -12
  105. data/spec/support/fixtures/12k.png +0 -0
  106. data/spec/support/fixtures/50x50.png +0 -0
  107. data/spec/support/fixtures/5k.png +0 -0
  108. data/spec/support/fixtures/animated +0 -0
  109. data/spec/support/fixtures/animated.gif +0 -0
  110. data/spec/support/fixtures/animated.unknown +0 -0
  111. data/spec/support/fixtures/aws_s3.yml +0 -13
  112. data/spec/support/fixtures/bad.png +0 -1
  113. data/spec/support/fixtures/big_image.jpg +0 -0
  114. data/spec/support/fixtures/empty.html +0 -1
  115. data/spec/support/fixtures/empty.xlsx +0 -0
  116. data/spec/support/fixtures/fog.yml +0 -8
  117. data/spec/support/fixtures/rotated.jpg +0 -0
  118. data/spec/support/fixtures/s3.yml +0 -8
  119. data/spec/support/fixtures/sample.xlsm +0 -0
  120. data/spec/support/fixtures/spaced file.jpg +0 -0
  121. data/spec/support/fixtures/spaced file.png +0 -0
  122. data/spec/support/fixtures/text.txt +0 -1
  123. data/spec/support/fixtures/twopage.pdf +0 -0
  124. data/spec/support/fixtures/uppercase.PNG +0 -0
  125. data/spec/support/matchers/accept.rb +0 -5
  126. data/spec/support/matchers/exist.rb +0 -5
  127. data/spec/support/matchers/have_column.rb +0 -23
  128. data/spec/support/mock_attachment.rb +0 -24
  129. data/spec/support/mock_interpolator.rb +0 -24
  130. data/spec/support/mock_url_generator_builder.rb +0 -26
  131. data/spec/support/model_reconstruction.rb +0 -72
  132. data/spec/support/reporting.rb +0 -11
  133. data/spec/support/test_data.rb +0 -13
  134. data/spec/support/version_helper.rb +0 -9
@@ -1,88 +0,0 @@
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.bigint :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
- expect(dummy.avatar).to_not receive(:post_process)
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,126 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Paperclip::MediaTypeSpoofDetector do
4
- it "rejects a file that is named .html and identifies as PNG" do
5
- file = File.open(fixture_file("5k.png"))
6
- assert Paperclip::MediaTypeSpoofDetector.using(file, "5k.html", "image/png").spoofed?
7
- end
8
-
9
- it "does not reject a file that is named .jpg and identifies as PNG" do
10
- file = File.open(fixture_file("5k.png"))
11
- assert !Paperclip::MediaTypeSpoofDetector.using(file, "5k.jpg", "image/png").spoofed?
12
- end
13
-
14
- it "does not reject a file that is named .html and identifies as HTML" do
15
- file = File.open(fixture_file("empty.html"))
16
- assert !Paperclip::MediaTypeSpoofDetector.using(file, "empty.html", "text/html").spoofed?
17
- end
18
-
19
- it "does not reject a file that does not have a name" do
20
- file = File.open(fixture_file("empty.html"))
21
- assert !Paperclip::MediaTypeSpoofDetector.using(file, "", "text/html").spoofed?
22
- end
23
-
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", "text/html").spoofed?
27
- end
28
-
29
- it "does not reject when the supplied file is an IOAdapter" do
30
- adapter = Paperclip.io_adapters.for(File.new(fixture_file("5k.png")))
31
- assert !Paperclip::MediaTypeSpoofDetector.using(adapter, adapter.original_filename, adapter.content_type).spoofed?
32
- end
33
-
34
- it "does not reject when the extension => content_type is in :content_type_mappings" do
35
- file = Tempfile.open(["test", ".PEM"])
36
- file.puts "Certificate!"
37
- file.close
38
-
39
- adapter = Paperclip.io_adapters.for(File.new(file.path))
40
-
41
- begin
42
- Paperclip.options[:content_type_mappings] = { pem: "text/plain" }
43
- assert !Paperclip::MediaTypeSpoofDetector.using(adapter, adapter.original_filename, adapter.content_type).spoofed?
44
-
45
- # As a string.
46
- Paperclip.options[:content_type_mappings] = { "pem" => "text/plain" }
47
- assert !Paperclip::MediaTypeSpoofDetector.using(adapter, adapter.original_filename, adapter.content_type).spoofed?
48
- ensure
49
- Paperclip.options[:content_type_mappings] = {}
50
- end
51
- end
52
-
53
- context "file named .html and is as HTML, but we're told JPG" do
54
- let(:file) { File.open(fixture_file("empty.html")) }
55
- let(:spoofed?) { Paperclip::MediaTypeSpoofDetector.using(file, "empty.html", "image/jpg").spoofed? }
56
-
57
- it "rejects the file" do
58
- assert spoofed?
59
- end
60
-
61
- it "logs info about the detected spoof" do
62
- expect(Paperclip).to receive(:log).with('Content Type Spoof: Filename empty.html (image/jpg from Headers, ["text/html"] from Extension), content type discovered from file command: text/html. See documentation to allow this combination.')
63
- spoofed?
64
- end
65
- end
66
-
67
- context "GIF file named without extension, but we're told GIF" do
68
- let(:file) { File.open(fixture_file("animated")) }
69
- let(:spoofed?) do
70
- Paperclip::MediaTypeSpoofDetector.
71
- using(file, "animated", "image/gif").
72
- spoofed?
73
- end
74
-
75
- it "accepts the file" do
76
- assert !spoofed?
77
- end
78
- end
79
-
80
- context "GIF file named without extension, but we're told HTML" do
81
- let(:file) { File.open(fixture_file("animated")) }
82
- let(:spoofed?) do
83
- Paperclip::MediaTypeSpoofDetector.
84
- using(file, "animated", "text/html").
85
- spoofed?
86
- end
87
-
88
- it "rejects the file" do
89
- assert spoofed?
90
- end
91
- end
92
-
93
- it "does not reject if content_type is empty but otherwise checks out" do
94
- file = File.open(fixture_file("empty.html"))
95
- assert !Paperclip::MediaTypeSpoofDetector.using(file, "empty.html", "").spoofed?
96
- end
97
-
98
- it "does allow array as :content_type_mappings" do
99
- begin
100
- Paperclip.options[:content_type_mappings] = {
101
- html: ["binary", "text/html"]
102
- }
103
- file = File.open(fixture_file("empty.html"))
104
- spoofed = Paperclip::MediaTypeSpoofDetector.
105
- using(file, "empty.html", "text/html").spoofed?
106
- assert !spoofed
107
- ensure
108
- Paperclip.options[:content_type_mappings] = {}
109
- end
110
- end
111
-
112
- context "#type_from_file_command" do
113
- let(:file) { File.new(fixture_file("empty.html")) }
114
- let(:detector) { Paperclip::MediaTypeSpoofDetector.new(file, "html", "") }
115
-
116
- it "does work with the output of old versions of file" do
117
- allow(Paperclip).to receive(:run).and_return("text/html charset=us-ascii")
118
- expect(detector.send(:type_from_file_command)).to eq("text/html")
119
- end
120
-
121
- it "does work with the output of new versions of file" do
122
- allow(Paperclip).to receive(:run).and_return("text/html; charset=us-ascii")
123
- expect(detector.send(:type_from_file_command)).to eq("text/html")
124
- end
125
- end
126
- end
@@ -1,30 +0,0 @@
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
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
@@ -1,44 +0,0 @@
1
- require "spec_helper"
2
-
3
- module Paperclip
4
- class MyVipsProcessor < Processor
5
- def make
6
- basename = File.basename(file.path, File.extname(file.path))
7
- dst = Paperclip::TempfileFactory.new.generate("#{basename}.png")
8
-
9
- # Use the new vips helper instead of convert
10
- vips("thumbnail :src :dst 100",
11
- src: File.expand_path(file.path),
12
- dst: File.expand_path(dst.path))
13
- dst
14
- end
15
- end
16
- end
17
-
18
- describe Paperclip::MyVipsProcessor do
19
- let(:file) { File.open(fixture_file("50x50.png")) }
20
- let(:options) { {} }
21
- let(:attachment) { double }
22
- let(:processor) { Paperclip::MyVipsProcessor.new(file, options, attachment) }
23
-
24
- subject { processor.make }
25
-
26
- it "processes the image using vips helper" do
27
- expect(subject).to respond_to(:path)
28
- expect(File.exist?(subject.path)).to be true
29
-
30
- # Check width using vipsheader
31
- require "shellwords"
32
- dimensions = `identify -format "%wx%h" "#{Shellwords.escape(subject.path)}"`.strip
33
- expect(dimensions).to eq("100x100")
34
- end
35
-
36
- it "calls the vips command" do
37
- expect(Paperclip).to receive(:run).with(
38
- "vips",
39
- "thumbnail :src :dst 100",
40
- hash_including(:src, :dst),
41
- )
42
- processor.make
43
- end
44
- end
@@ -1,88 +0,0 @@
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
- begin
10
- File.unlink(Paperclip.registered_attachments_styles_path)
11
- rescue StandardError
12
- nil
13
- end
14
- end
15
-
16
- it "enables to get and set path to registered styles file" do
17
- assert_equal ROOT.join("tmp/public/system/paperclip_attachments.yml").to_s, Paperclip.registered_attachments_styles_path
18
- Paperclip.registered_attachments_styles_path = "/tmp/config/paperclip_attachments.yml"
19
- assert_equal "/tmp/config/paperclip_attachments.yml", Paperclip.registered_attachments_styles_path
20
- Paperclip.registered_attachments_styles_path = nil
21
- assert_equal ROOT.join("tmp/public/system/paperclip_attachments.yml").to_s, Paperclip.registered_attachments_styles_path
22
- end
23
-
24
- it "is able to get current attachment styles" do
25
- assert_equal Hash.new, Paperclip.send(:current_attachments_styles)
26
- rebuild_model styles: { croppable: "600x600>", big: "1000x1000>" }
27
- expected_hash = { Dummy: { avatar: [:big, :croppable] } }
28
- assert_equal expected_hash, Paperclip.send(:current_attachments_styles)
29
- end
30
-
31
- it "is able to save current attachment styles for further comparison" do
32
- rebuild_model styles: { croppable: "600x600>", big: "1000x1000>" }
33
- Paperclip.save_current_attachments_styles!
34
- expected_hash = { Dummy: { avatar: [:big, :croppable] } }
35
- assert_equal expected_hash, YAML.load_file(Paperclip.registered_attachments_styles_path)
36
- end
37
-
38
- it "is able to read registered attachment styles from file" do
39
- rebuild_model styles: { croppable: "600x600>", big: "1000x1000>" }
40
- Paperclip.save_current_attachments_styles!
41
- expected_hash = { Dummy: { avatar: [:big, :croppable] } }
42
- assert_equal expected_hash, Paperclip.send(:get_registered_attachments_styles)
43
- end
44
-
45
- it "is able to calculate differences between registered styles and current styles" do
46
- rebuild_model styles: { croppable: "600x600>", big: "1000x1000>" }
47
- Paperclip.save_current_attachments_styles!
48
- rebuild_model styles: { thumb: "x100", export: "x400>", croppable: "600x600>", big: "1000x1000>" }
49
- expected_hash = { Dummy: { avatar: [:export, :thumb] } }
50
- assert_equal expected_hash, Paperclip.missing_attachments_styles
51
-
52
- ActiveRecord::Migration.create_table :books, force: true
53
- class ::Book < ActiveRecord::Base
54
- has_attached_file :cover, styles: { small: "x100", large: "1000x1000>" }
55
- has_attached_file :sample, styles: { thumb: "x100" }
56
- end
57
-
58
- expected_hash = {
59
- Dummy: { avatar: [:export, :thumb] },
60
- Book: { sample: [:thumb], cover: [:large, :small] }
61
- }
62
- assert_equal expected_hash, Paperclip.missing_attachments_styles
63
- Paperclip.save_current_attachments_styles!
64
- assert_equal Hash.new, Paperclip.missing_attachments_styles
65
- end
66
-
67
- it "is able to calculate differences when a new attachment is added to a model" do
68
- rebuild_model styles: { croppable: "600x600>", big: "1000x1000>" }
69
- Paperclip.save_current_attachments_styles!
70
-
71
- class ::Dummy
72
- has_attached_file :photo, styles: { small: "x100", large: "1000x1000>" }
73
- end
74
-
75
- expected_hash = {
76
- Dummy: { photo: [:large, :small] }
77
- }
78
- assert_equal expected_hash, Paperclip.missing_attachments_styles
79
- Paperclip.save_current_attachments_styles!
80
- assert_equal Hash.new, Paperclip.missing_attachments_styles
81
- end
82
-
83
- # It's impossible to build styles hash without loading from database whole bunch of records
84
- it "skips lambda-styles" do
85
- rebuild_model styles: lambda { |attachment| attachment.instance.other == "a" ? { thumb: "50x50#" } : { large: "400x400" } }
86
- assert_equal Hash.new, Paperclip.send(:current_attachments_styles)
87
- end
88
- end
@@ -1,196 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Paperclip do
4
- context ".run" do
5
- before do
6
- Paperclip.options[:log_command] = false
7
- expect(Terrapin::CommandLine).to receive(:new).with("convert", "stuff", {}).and_return(double(run: nil))
8
- @original_command_line_path = Terrapin::CommandLine.path
9
- end
10
-
11
- after do
12
- Paperclip.options[:log_command] = true
13
- Terrapin::CommandLine.path = @original_command_line_path
14
- end
15
-
16
- it "runs the command with Terrapin" do
17
- Paperclip.run("convert", "stuff")
18
- end
19
-
20
- it "saves Terrapin::CommandLine.path that set before" do
21
- Terrapin::CommandLine.path = "/opt/my_app/bin"
22
- Paperclip.run("convert", "stuff")
23
- expect(Terrapin::CommandLine.path).to match("/opt/my_app/bin")
24
- end
25
-
26
- it "does not duplicate Terrapin::CommandLine.path on multiple runs" do
27
- expect(Terrapin::CommandLine).to receive(:new).with("convert", "more_stuff", {}).and_return(double(run: nil))
28
- Terrapin::CommandLine.path = nil
29
- Paperclip.options[:command_path] = "/opt/my_app/bin"
30
- Paperclip.run("convert", "stuff")
31
- Paperclip.run("convert", "more_stuff")
32
-
33
- cmd_path = Paperclip.options[:command_path]
34
- assert_equal 1, Terrapin::CommandLine.path.scan(cmd_path).count
35
- end
36
- end
37
-
38
- it "does not raise errors when doing a lot of running" do
39
- Paperclip.options[:command_path] = ["/usr/local/bin"] * 1024
40
- Terrapin::CommandLine.path = "/something/else"
41
- 100.times do |x|
42
- Paperclip.run("echo", x.to_s)
43
- end
44
- end
45
-
46
- context "Calling Paperclip.log without options[:logger] set" do
47
- before do
48
- Paperclip.logger = nil
49
- Paperclip.options[:logger] = nil
50
- end
51
-
52
- after do
53
- Paperclip.options[:logger] = ActiveRecord::Base.logger
54
- Paperclip.logger = ActiveRecord::Base.logger
55
- end
56
-
57
- it "does not raise an error when log is called" do
58
- silence_stream(STDOUT) do
59
- Paperclip.log("something")
60
- end
61
- end
62
- end
63
- context "Calling Paperclip.run with a logger" do
64
- it "passes the defined logger if :log_command is set" do
65
- Paperclip.options[:log_command] = true
66
- expect(Terrapin::CommandLine).to receive(:new).with("convert", "stuff", { logger: Paperclip.logger }).and_return(double(run: nil))
67
- Paperclip.run("convert", "stuff")
68
- end
69
- end
70
-
71
- context "Paperclip.each_instance_with_attachment" do
72
- before do
73
- @file = File.new(fixture_file("5k.png"), "rb")
74
- d1 = Dummy.create(avatar: @file)
75
- d2 = Dummy.create
76
- d3 = Dummy.create(avatar: @file)
77
- @expected = [d1, d3]
78
- end
79
-
80
- after { @file.close }
81
-
82
- it "yields every instance of a model that has an attachment" do
83
- actual = []
84
- Paperclip.each_instance_with_attachment("Dummy", "avatar") do |instance|
85
- actual << instance
86
- end
87
- expect(actual).to match_array @expected
88
- end
89
- end
90
-
91
- it "raises when sent #processor and the name of a class that doesn't exist" do
92
- assert_raises(LoadError) { Paperclip.processor(:boogey_man) }
93
- end
94
-
95
- it "returns a class when sent #processor and the name of a class under Paperclip" do
96
- assert_equal ::Paperclip::Thumbnail, Paperclip.processor(:thumbnail)
97
- end
98
-
99
- it "gets a class from a namespaced class name" do
100
- class ::One; class Two; end; end
101
- assert_equal ::One::Two, Paperclip.class_for("One::Two")
102
- end
103
-
104
- it "raises when class doesn't exist in specified namespace" do
105
- class ::Three; end
106
- class ::Four; end
107
- assert_raises NameError do
108
- Paperclip.class_for("Three::Four")
109
- end
110
- end
111
-
112
- context "An ActiveRecord model with an 'avatar' attachment" do
113
- before do
114
- rebuild_model path: "tmp/:class/omg/:style.:extension"
115
- @file = File.new(fixture_file("5k.png"), "rb")
116
- end
117
-
118
- after { @file.close }
119
-
120
- it "does not error when trying to also create a 'blah' attachment" do
121
- assert_nothing_raised do
122
- Dummy.class_eval do
123
- has_attached_file :blah
124
- end
125
- end
126
- end
127
-
128
- context "with a subclass" do
129
- before do
130
- class ::SubDummy < Dummy; end
131
- end
132
-
133
- it "is able to use the attachment from the subclass" do
134
- assert_nothing_raised do
135
- @subdummy = SubDummy.create(avatar: @file)
136
- end
137
- end
138
-
139
- after do
140
- SubDummy.delete_all
141
- begin
142
- Object.send(:remove_const, "SubDummy")
143
- rescue StandardError
144
- nil
145
- end
146
- end
147
- end
148
-
149
- it "has an avatar getter method" do
150
- assert Dummy.new.respond_to?(:avatar)
151
- end
152
-
153
- it "has an avatar setter method" do
154
- assert Dummy.new.respond_to?(:avatar=)
155
- end
156
-
157
- context "that is valid" do
158
- before do
159
- @dummy = Dummy.new
160
- @dummy.avatar = @file
161
- end
162
-
163
- it "is valid" do
164
- assert @dummy.valid?
165
- end
166
- end
167
-
168
- it "does not have Attachment in the ActiveRecord::Base namespace" do
169
- assert_raises(NameError) do
170
- ActiveRecord::Base::Attachment
171
- end
172
- end
173
- end
174
-
175
- context "configuring a custom processor" do
176
- before do
177
- @freedom_processor = Class.new do
178
- def make(file, _options = {}, _attachment = nil)
179
- file
180
- end
181
- end.new
182
-
183
- Paperclip.configure do |config|
184
- config.register_processor(:freedom, @freedom_processor)
185
- end
186
- end
187
-
188
- it "is able to find the custom processor" do
189
- assert_equal @freedom_processor, Paperclip.processor(:freedom)
190
- end
191
-
192
- after do
193
- Paperclip.clear_processors!
194
- end
195
- end
196
- end
@@ -1,37 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe "Plural cache" do
4
- it "caches pluralizations" do
5
- cache = Paperclip::Interpolations::PluralCache.new
6
- symbol = :box
7
-
8
- first = cache.pluralize_symbol(symbol)
9
- second = cache.pluralize_symbol(symbol)
10
- expect(first).to equal(second)
11
- end
12
-
13
- it "caches pluralizations and underscores" do
14
- class BigBox; end
15
- cache = Paperclip::Interpolations::PluralCache.new
16
- klass = BigBox
17
-
18
- first = cache.underscore_and_pluralize_class(klass)
19
- second = cache.underscore_and_pluralize_class(klass)
20
- expect(first).to equal(second)
21
- end
22
-
23
- it "pluralizes words" do
24
- cache = Paperclip::Interpolations::PluralCache.new
25
- symbol = :box
26
-
27
- expect(cache.pluralize_symbol(symbol)).to eq("boxes")
28
- end
29
-
30
- it "pluralizes and underscore class names" do
31
- class BigBox; end
32
- cache = Paperclip::Interpolations::PluralCache.new
33
- klass = BigBox
34
-
35
- expect(cache.underscore_and_pluralize_class(klass)).to eq("big_boxes")
36
- end
37
- end
@@ -1,57 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Paperclip::ProcessorHelpers do
4
- describe ".load_processor" do
5
- context "when the file exists in lib/paperclip" do
6
- it "loads it correctly" do
7
- pathname = Pathname.new("my_app")
8
- main_path = "main_path"
9
- alternate_path = "alternate_path"
10
-
11
- allow(Rails).to receive(:root).and_return(pathname)
12
- expect(File).to receive(:expand_path).with(pathname.join("lib/paperclip", "custom.rb")).and_return(main_path)
13
- expect(File).to receive(:expand_path).with(pathname.join("lib/paperclip_processors", "custom.rb")).and_return(alternate_path)
14
- expect(File).to receive(:exist?).with(main_path).and_return(true)
15
- expect(File).to receive(:exist?).with(alternate_path).and_return(false)
16
-
17
- expect(Paperclip).to receive(:require).with(main_path)
18
-
19
- Paperclip.load_processor(:custom)
20
- end
21
- end
22
-
23
- context "when the file exists in lib/paperclip_processors" do
24
- it "loads it correctly" do
25
- pathname = Pathname.new("my_app")
26
- main_path = "main_path"
27
- alternate_path = "alternate_path"
28
-
29
- allow(Rails).to receive(:root).and_return(pathname)
30
- expect(File).to receive(:expand_path).with(pathname.join("lib/paperclip", "custom.rb")).and_return(main_path)
31
- expect(File).to receive(:expand_path).with(pathname.join("lib/paperclip_processors", "custom.rb")).and_return(alternate_path)
32
- expect(File).to receive(:exist?).with(main_path).and_return(false)
33
- expect(File).to receive(:exist?).with(alternate_path).and_return(true)
34
-
35
- expect(Paperclip).to receive(:require).with(alternate_path)
36
-
37
- Paperclip.load_processor(:custom)
38
- end
39
- end
40
-
41
- context "when the file does not exist in lib/paperclip_processors" do
42
- it "raises an error" do
43
- pathname = Pathname.new("my_app")
44
- main_path = "main_path"
45
- alternate_path = "alternate_path"
46
-
47
- allow(Rails).to receive(:root).and_return(pathname)
48
- allow(File).to receive(:expand_path).with(pathname.join("lib/paperclip", "custom.rb")).and_return(main_path)
49
- allow(File).to receive(:expand_path).with(pathname.join("lib/paperclip_processors", "custom.rb")).and_return(alternate_path)
50
- allow(File).to receive(:exist?).with(main_path).and_return(false)
51
- allow(File).to receive(:exist?).with(alternate_path).and_return(false)
52
-
53
- assert_raises(LoadError) { Paperclip.processor(:custom) }
54
- end
55
- end
56
- end
57
- end