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.
- checksums.yaml +4 -4
- data/NEWS +4 -0
- data/lib/paperclip/version.rb +1 -1
- metadata +3 -247
- data/.github/FUNDING.yml +0 -3
- data/.github/ISSUE_TEMPLATE/bug_report.md +0 -18
- data/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- data/.github/workflows/reviewdog.yml +0 -23
- data/.github/workflows/tests.yml +0 -56
- data/.gitignore +0 -19
- data/.qlty/.gitignore +0 -7
- data/.qlty/qlty.toml +0 -89
- data/Appraisals +0 -29
- data/Gemfile +0 -18
- data/bin/console +0 -11
- data/features/basic_integration.feature +0 -112
- data/features/migration.feature +0 -29
- data/features/rake_tasks.feature +0 -62
- data/features/step_definitions/attachment_steps.rb +0 -138
- data/features/step_definitions/html_steps.rb +0 -15
- data/features/step_definitions/rails_steps.rb +0 -271
- data/features/step_definitions/s3_steps.rb +0 -16
- data/features/step_definitions/web_steps.rb +0 -106
- data/features/support/env.rb +0 -12
- data/features/support/file_helpers.rb +0 -34
- data/features/support/fixtures/boot_config.txt +0 -15
- data/features/support/fixtures/gemfile.txt +0 -5
- data/features/support/fixtures/preinitializer.txt +0 -20
- data/features/support/paths.rb +0 -28
- data/features/support/rails.rb +0 -39
- data/features/support/selectors.rb +0 -19
- data/features/support/webmock_setup.rb +0 -8
- data/gemfiles/7.0.gemfile +0 -21
- data/gemfiles/7.1.gemfile +0 -21
- data/gemfiles/7.2.gemfile +0 -21
- data/gemfiles/8.0.gemfile +0 -21
- data/gemfiles/8.1.gemfile +0 -21
- data/paperclip.gemspec +0 -52
- data/spec/database.yml +0 -4
- data/spec/paperclip/attachment_definitions_spec.rb +0 -313
- data/spec/paperclip/attachment_processing_spec.rb +0 -79
- data/spec/paperclip/attachment_registry_spec.rb +0 -158
- data/spec/paperclip/attachment_spec.rb +0 -1617
- data/spec/paperclip/content_type_detector_spec.rb +0 -58
- data/spec/paperclip/file_command_content_type_detector_spec.rb +0 -40
- data/spec/paperclip/filename_cleaner_spec.rb +0 -13
- data/spec/paperclip/geometry_detector_spec.rb +0 -96
- data/spec/paperclip/geometry_parser_spec.rb +0 -73
- data/spec/paperclip/geometry_spec.rb +0 -270
- data/spec/paperclip/glue_spec.rb +0 -63
- data/spec/paperclip/has_attached_file_spec.rb +0 -78
- data/spec/paperclip/helpers_spec.rb +0 -49
- data/spec/paperclip/integration_spec.rb +0 -702
- data/spec/paperclip/interpolations_spec.rb +0 -270
- data/spec/paperclip/io_adapters/abstract_adapter_spec.rb +0 -160
- data/spec/paperclip/io_adapters/attachment_adapter_spec.rb +0 -167
- data/spec/paperclip/io_adapters/data_uri_adapter_spec.rb +0 -88
- data/spec/paperclip/io_adapters/empty_string_adapter_spec.rb +0 -17
- data/spec/paperclip/io_adapters/file_adapter_spec.rb +0 -134
- data/spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb +0 -142
- data/spec/paperclip/io_adapters/identity_adapter_spec.rb +0 -8
- data/spec/paperclip/io_adapters/nil_adapter_spec.rb +0 -25
- data/spec/paperclip/io_adapters/registry_spec.rb +0 -35
- data/spec/paperclip/io_adapters/stringio_adapter_spec.rb +0 -64
- data/spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb +0 -146
- data/spec/paperclip/io_adapters/uri_adapter_spec.rb +0 -231
- data/spec/paperclip/lazy_thumbnail_compatibility_spec.rb +0 -266
- data/spec/paperclip/matchers/have_attached_file_matcher_spec.rb +0 -19
- data/spec/paperclip/matchers/validate_attachment_content_type_matcher_spec.rb +0 -108
- data/spec/paperclip/matchers/validate_attachment_presence_matcher_spec.rb +0 -69
- data/spec/paperclip/matchers/validate_attachment_size_matcher_spec.rb +0 -88
- data/spec/paperclip/media_type_spoof_detector_spec.rb +0 -126
- data/spec/paperclip/meta_class_spec.rb +0 -30
- data/spec/paperclip/migration_guide_example_spec.rb +0 -44
- data/spec/paperclip/paperclip_missing_attachment_styles_spec.rb +0 -88
- data/spec/paperclip/paperclip_spec.rb +0 -196
- data/spec/paperclip/plural_cache_spec.rb +0 -37
- data/spec/paperclip/processor_helpers_spec.rb +0 -57
- data/spec/paperclip/processor_spec.rb +0 -60
- data/spec/paperclip/rails_environment_spec.rb +0 -30
- data/spec/paperclip/rake_spec.rb +0 -103
- data/spec/paperclip/schema_spec.rb +0 -298
- data/spec/paperclip/storage/filesystem_spec.rb +0 -102
- data/spec/paperclip/storage/fog_spec.rb +0 -606
- data/spec/paperclip/storage/s3_live_spec.rb +0 -188
- data/spec/paperclip/storage/s3_spec.rb +0 -1974
- data/spec/paperclip/style_spec.rb +0 -309
- data/spec/paperclip/tempfile_factory_spec.rb +0 -33
- data/spec/paperclip/tempfile_spec.rb +0 -35
- data/spec/paperclip/thumbnail_custom_options_spec.rb +0 -225
- data/spec/paperclip/thumbnail_loader_options_spec.rb +0 -53
- data/spec/paperclip/thumbnail_security_spec.rb +0 -42
- data/spec/paperclip/thumbnail_spec.rb +0 -1488
- data/spec/paperclip/url_generator_spec.rb +0 -231
- data/spec/paperclip/validators/attachment_content_type_validator_spec.rb +0 -410
- data/spec/paperclip/validators/attachment_file_name_validator_spec.rb +0 -249
- data/spec/paperclip/validators/attachment_presence_validator_spec.rb +0 -85
- data/spec/paperclip/validators/attachment_size_validator_spec.rb +0 -325
- data/spec/paperclip/validators/media_type_spoof_detection_validator_spec.rb +0 -48
- data/spec/paperclip/validators_spec.rb +0 -179
- data/spec/spec_helper.rb +0 -52
- data/spec/support/assertions.rb +0 -84
- data/spec/support/fake_model.rb +0 -24
- data/spec/support/fake_rails.rb +0 -12
- data/spec/support/fixtures/12k.png +0 -0
- data/spec/support/fixtures/50x50.png +0 -0
- data/spec/support/fixtures/5k.png +0 -0
- data/spec/support/fixtures/animated +0 -0
- data/spec/support/fixtures/animated.gif +0 -0
- data/spec/support/fixtures/animated.unknown +0 -0
- data/spec/support/fixtures/aws_s3.yml +0 -13
- data/spec/support/fixtures/bad.png +0 -1
- data/spec/support/fixtures/big_image.jpg +0 -0
- data/spec/support/fixtures/empty.html +0 -1
- data/spec/support/fixtures/empty.xlsx +0 -0
- data/spec/support/fixtures/fog.yml +0 -8
- data/spec/support/fixtures/rotated.jpg +0 -0
- data/spec/support/fixtures/s3.yml +0 -8
- data/spec/support/fixtures/sample.xlsm +0 -0
- data/spec/support/fixtures/spaced file.jpg +0 -0
- data/spec/support/fixtures/spaced file.png +0 -0
- data/spec/support/fixtures/text.txt +0 -1
- data/spec/support/fixtures/twopage.pdf +0 -0
- data/spec/support/fixtures/uppercase.PNG +0 -0
- data/spec/support/matchers/accept.rb +0 -5
- data/spec/support/matchers/exist.rb +0 -5
- data/spec/support/matchers/have_column.rb +0 -23
- data/spec/support/mock_attachment.rb +0 -24
- data/spec/support/mock_interpolator.rb +0 -24
- data/spec/support/mock_url_generator_builder.rb +0 -26
- data/spec/support/model_reconstruction.rb +0 -72
- data/spec/support/reporting.rb +0 -11
- data/spec/support/test_data.rb +0 -13
- 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
|