kt-paperclip 5.4.0 → 7.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/FUNDING.yml +3 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
- data/.github/ISSUE_TEMPLATE/custom.md +10 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.hound.yml +3 -1055
- data/.rubocop.yml +1061 -1
- data/.travis.yml +23 -4
- data/Appraisals +23 -0
- data/CONTRIBUTING.md +4 -5
- data/Gemfile +10 -7
- data/NEWS +52 -0
- data/README.md +58 -46
- data/Rakefile +29 -21
- data/UPGRADING +3 -3
- data/features/basic_integration.feature +4 -0
- data/features/migration.feature +10 -51
- data/features/step_definitions/attachment_steps.rb +23 -13
- data/features/step_definitions/html_steps.rb +5 -5
- data/features/step_definitions/rails_steps.rb +29 -9
- data/features/step_definitions/s3_steps.rb +3 -3
- data/features/step_definitions/web_steps.rb +5 -6
- data/features/support/env.rb +4 -4
- data/features/support/fakeweb.rb +3 -5
- data/features/support/file_helpers.rb +2 -2
- data/features/support/paths.rb +4 -4
- data/features/support/rails.rb +7 -7
- data/features/support/selectors.rb +1 -1
- data/gemfiles/4.2.gemfile +7 -4
- data/gemfiles/5.0.gemfile +7 -4
- data/gemfiles/5.1.gemfile +20 -0
- data/gemfiles/5.2.gemfile +20 -0
- data/gemfiles/6.0.gemfile +20 -0
- data/gemfiles/6.1.gemfile +21 -0
- data/gemfiles/7.0.gemfile +21 -0
- data/lib/generators/paperclip/paperclip_generator.rb +6 -8
- data/lib/paperclip/attachment.rb +103 -105
- data/lib/paperclip/attachment_registry.rb +2 -2
- data/lib/paperclip/content_type_detector.rb +10 -5
- data/lib/paperclip/file_command_content_type_detector.rb +1 -3
- data/lib/paperclip/filename_cleaner.rb +0 -1
- data/lib/paperclip/geometry.rb +18 -19
- data/lib/paperclip/geometry_detector_factory.rb +13 -16
- data/lib/paperclip/geometry_parser_factory.rb +5 -5
- data/lib/paperclip/glue.rb +3 -3
- data/lib/paperclip/has_attached_file.rb +5 -4
- data/lib/paperclip/helpers.rb +3 -3
- data/lib/paperclip/interpolations.rb +42 -38
- data/lib/paperclip/io_adapters/abstract_adapter.rb +16 -14
- data/lib/paperclip/io_adapters/attachment_adapter.rb +12 -6
- data/lib/paperclip/io_adapters/data_uri_adapter.rb +1 -1
- data/lib/paperclip/io_adapters/file_adapter.rb +1 -3
- data/lib/paperclip/io_adapters/http_url_proxy_adapter.rb +1 -1
- data/lib/paperclip/io_adapters/identity_adapter.rb +1 -2
- data/lib/paperclip/io_adapters/registry.rb +1 -1
- data/lib/paperclip/io_adapters/stringio_adapter.rb +1 -1
- data/lib/paperclip/io_adapters/uploaded_file_adapter.rb +6 -8
- data/lib/paperclip/io_adapters/uri_adapter.rb +21 -9
- data/lib/paperclip/logger.rb +1 -1
- data/lib/paperclip/matchers/have_attached_file_matcher.rb +4 -4
- data/lib/paperclip/matchers/validate_attachment_content_type_matcher.rb +19 -18
- data/lib/paperclip/matchers/validate_attachment_presence_matcher.rb +4 -4
- data/lib/paperclip/matchers/validate_attachment_size_matcher.rb +11 -10
- data/lib/paperclip/matchers.rb +4 -4
- data/lib/paperclip/media_type_spoof_detector.rb +13 -13
- data/lib/paperclip/missing_attachment_styles.rb +11 -6
- data/lib/paperclip/processor.rb +13 -6
- data/lib/paperclip/processor_helpers.rb +3 -1
- data/lib/paperclip/rails_environment.rb +1 -5
- data/lib/paperclip/railtie.rb +5 -5
- data/lib/paperclip/schema.rb +16 -12
- data/lib/paperclip/storage/filesystem.rb +6 -8
- data/lib/paperclip/storage/fog.rb +36 -32
- data/lib/paperclip/storage/s3.rb +68 -76
- data/lib/paperclip/style.rb +3 -6
- data/lib/paperclip/tempfile.rb +4 -5
- data/lib/paperclip/tempfile_factory.rb +0 -1
- data/lib/paperclip/thumbnail.rb +11 -11
- data/lib/paperclip/url_generator.rb +5 -5
- data/lib/paperclip/validators/attachment_content_type_validator.rb +11 -4
- data/lib/paperclip/validators/attachment_file_name_validator.rb +14 -12
- data/lib/paperclip/validators/attachment_file_type_ignorance_validator.rb +1 -2
- data/lib/paperclip/validators/attachment_presence_validator.rb +3 -5
- data/lib/paperclip/validators/attachment_size_validator.rb +28 -11
- data/lib/paperclip/validators/media_type_spoof_detection_validator.rb +3 -1
- data/lib/paperclip/validators.rb +16 -17
- data/lib/paperclip/version.rb +1 -3
- data/lib/paperclip.rb +49 -48
- data/lib/tasks/paperclip.rake +23 -24
- data/paperclip.gemspec +29 -33
- data/shoulda_macros/paperclip.rb +16 -16
- data/spec/paperclip/attachment_definitions_spec.rb +5 -5
- data/spec/paperclip/attachment_processing_spec.rb +22 -23
- data/spec/paperclip/attachment_registry_spec.rb +15 -15
- data/spec/paperclip/attachment_spec.rb +238 -196
- data/spec/paperclip/content_type_detector_spec.rb +18 -12
- data/spec/paperclip/file_command_content_type_detector_spec.rb +10 -10
- data/spec/paperclip/filename_cleaner_spec.rb +3 -4
- data/spec/paperclip/geometry_detector_spec.rb +7 -8
- data/spec/paperclip/geometry_parser_spec.rb +31 -31
- data/spec/paperclip/geometry_spec.rb +24 -24
- data/spec/paperclip/glue_spec.rb +3 -5
- data/spec/paperclip/has_attached_file_spec.rb +46 -126
- data/spec/paperclip/integration_spec.rb +111 -77
- data/spec/paperclip/interpolations_spec.rb +101 -93
- data/spec/paperclip/io_adapters/abstract_adapter_spec.rb +41 -13
- data/spec/paperclip/io_adapters/attachment_adapter_spec.rb +8 -10
- data/spec/paperclip/io_adapters/data_uri_adapter_spec.rb +13 -14
- data/spec/paperclip/io_adapters/empty_string_adapter_spec.rb +4 -4
- data/spec/paperclip/io_adapters/file_adapter_spec.rb +12 -12
- data/spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb +58 -37
- data/spec/paperclip/io_adapters/identity_adapter_spec.rb +1 -1
- data/spec/paperclip/io_adapters/nil_adapter_spec.rb +2 -2
- data/spec/paperclip/io_adapters/registry_spec.rb +4 -4
- data/spec/paperclip/io_adapters/stringio_adapter_spec.rb +10 -10
- data/spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb +6 -6
- data/spec/paperclip/io_adapters/uri_adapter_spec.rb +90 -31
- data/spec/paperclip/matchers/have_attached_file_matcher_spec.rb +3 -3
- data/spec/paperclip/matchers/validate_attachment_content_type_matcher_spec.rb +4 -5
- data/spec/paperclip/matchers/validate_attachment_presence_matcher_spec.rb +4 -4
- data/spec/paperclip/matchers/validate_attachment_size_matcher_spec.rb +4 -4
- data/spec/paperclip/media_type_spoof_detector_spec.rb +50 -24
- data/spec/paperclip/meta_class_spec.rb +3 -3
- data/spec/paperclip/paperclip_missing_attachment_styles_spec.rb +28 -24
- data/spec/paperclip/paperclip_spec.rb +15 -11
- data/spec/paperclip/plural_cache_spec.rb +8 -8
- data/spec/paperclip/processor_helpers_spec.rb +35 -35
- data/spec/paperclip/processor_spec.rb +8 -8
- data/spec/paperclip/rails_environment_spec.rb +7 -10
- data/spec/paperclip/rake_spec.rb +39 -39
- data/spec/paperclip/schema_spec.rb +57 -53
- data/spec/paperclip/storage/filesystem_spec.rb +29 -6
- data/spec/paperclip/storage/fog_spec.rb +122 -82
- data/spec/paperclip/storage/s3_live_spec.rb +22 -22
- data/spec/paperclip/storage/s3_spec.rb +649 -583
- data/spec/paperclip/style_spec.rb +67 -71
- data/spec/paperclip/tempfile_factory_spec.rb +5 -5
- data/spec/paperclip/thumbnail_spec.rb +68 -67
- data/spec/paperclip/url_generator_spec.rb +18 -19
- data/spec/paperclip/validators/attachment_content_type_validator_spec.rb +115 -27
- data/spec/paperclip/validators/attachment_file_name_validator_spec.rb +105 -16
- data/spec/paperclip/validators/attachment_presence_validator_spec.rb +5 -5
- data/spec/paperclip/validators/attachment_size_validator_spec.rb +111 -21
- data/spec/paperclip/validators/media_type_spoof_detection_validator_spec.rb +9 -13
- data/spec/paperclip/validators_spec.rb +61 -46
- data/spec/spec_helper.rb +21 -23
- data/spec/support/assertions.rb +8 -6
- data/spec/support/fake_model.rb +1 -2
- data/spec/support/fake_rails.rb +1 -1
- data/spec/support/fixtures/aws_s3.yml +13 -0
- data/spec/support/fixtures/sample.xlsm +0 -0
- data/spec/support/matchers/exist.rb +1 -1
- data/spec/support/matchers/have_column.rb +1 -1
- data/spec/support/mock_url_generator_builder.rb +2 -3
- data/spec/support/model_reconstruction.rb +16 -12
- data/spec/support/reporting.rb +1 -1
- data/spec/support/test_data.rb +2 -2
- metadata +58 -106
- data/spec/support/conditional_filter_helper.rb +0 -5
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "spec_helper"
|
2
|
+
require "paperclip/matchers"
|
3
3
|
|
4
4
|
describe Paperclip::Shoulda::Matchers::ValidateAttachmentSizeMatcher do
|
5
5
|
extend Paperclip::Shoulda::Matchers
|
@@ -7,7 +7,7 @@ describe Paperclip::Shoulda::Matchers::ValidateAttachmentSizeMatcher do
|
|
7
7
|
before do
|
8
8
|
reset_table("dummies") do |d|
|
9
9
|
d.string :avatar_file_name
|
10
|
-
d.
|
10
|
+
d.bigint :avatar_file_size
|
11
11
|
end
|
12
12
|
reset_class "Dummy"
|
13
13
|
Dummy.do_not_validate_attachment_file_type :avatar
|
@@ -75,7 +75,7 @@ describe Paperclip::Shoulda::Matchers::ValidateAttachmentSizeMatcher do
|
|
75
75
|
|
76
76
|
it "be skipped" do
|
77
77
|
dummy = Dummy.new
|
78
|
-
dummy.avatar.
|
78
|
+
expect(dummy.avatar).to_not receive(:post_process)
|
79
79
|
expect(matcher.greater_than(1024)).to accept(dummy)
|
80
80
|
end
|
81
81
|
end
|
@@ -1,44 +1,44 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe Paperclip::MediaTypeSpoofDetector do
|
4
|
-
it
|
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", "image/png").spoofed?
|
7
7
|
end
|
8
8
|
|
9
|
-
it
|
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
|
-
assert !
|
11
|
+
assert !Paperclip::MediaTypeSpoofDetector.using(file, "5k.jpg", "image/png").spoofed?
|
12
12
|
end
|
13
13
|
|
14
|
-
it
|
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
|
-
assert !
|
16
|
+
assert !Paperclip::MediaTypeSpoofDetector.using(file, "empty.html", "text/html").spoofed?
|
17
17
|
end
|
18
18
|
|
19
|
-
it
|
19
|
+
it "does not reject a file that does not have a name" do
|
20
20
|
file = File.open(fixture_file("empty.html"))
|
21
|
-
assert !
|
21
|
+
assert !Paperclip::MediaTypeSpoofDetector.using(file, "", "text/html").spoofed?
|
22
22
|
end
|
23
23
|
|
24
|
-
it
|
24
|
+
it "does not reject a file that does have an extension" do
|
25
25
|
file = File.open(fixture_file("empty.html"))
|
26
|
-
assert !
|
26
|
+
assert !Paperclip::MediaTypeSpoofDetector.using(file, "data", "text/html").spoofed?
|
27
27
|
end
|
28
28
|
|
29
|
-
it
|
29
|
+
it "does not reject when the supplied file is an IOAdapter" do
|
30
30
|
adapter = Paperclip.io_adapters.for(File.new(fixture_file("5k.png")))
|
31
|
-
assert !
|
31
|
+
assert !Paperclip::MediaTypeSpoofDetector.using(adapter, adapter.original_filename, adapter.content_type).spoofed?
|
32
32
|
end
|
33
33
|
|
34
|
-
it
|
34
|
+
it "does not reject when the extension => content_type is in :content_type_mappings" do
|
35
35
|
begin
|
36
36
|
Paperclip.options[:content_type_mappings] = { pem: "text/plain" }
|
37
37
|
file = Tempfile.open(["test", ".PEM"])
|
38
38
|
file.puts "Certificate!"
|
39
39
|
file.close
|
40
|
-
adapter = Paperclip.io_adapters.for(File.new(file.path))
|
41
|
-
assert !
|
40
|
+
adapter = Paperclip.io_adapters.for(File.new(file.path))
|
41
|
+
assert !Paperclip::MediaTypeSpoofDetector.using(adapter, adapter.original_filename, adapter.content_type).spoofed?
|
42
42
|
ensure
|
43
43
|
Paperclip.options[:content_type_mappings] = {}
|
44
44
|
end
|
@@ -53,24 +53,50 @@ describe Paperclip::MediaTypeSpoofDetector do
|
|
53
53
|
end
|
54
54
|
|
55
55
|
it "logs info about the detected spoof" do
|
56
|
-
Paperclip.
|
56
|
+
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.')
|
57
57
|
spoofed?
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
+
context "GIF file named without extension, but we're told GIF" do
|
62
|
+
let(:file) { File.open(fixture_file("animated")) }
|
63
|
+
let(:spoofed?) do
|
64
|
+
Paperclip::MediaTypeSpoofDetector.
|
65
|
+
using(file, "animated", "image/gif").
|
66
|
+
spoofed?
|
67
|
+
end
|
68
|
+
|
69
|
+
it "accepts the file" do
|
70
|
+
assert !spoofed?
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "GIF file named without extension, but we're told HTML" do
|
75
|
+
let(:file) { File.open(fixture_file("animated")) }
|
76
|
+
let(:spoofed?) do
|
77
|
+
Paperclip::MediaTypeSpoofDetector.
|
78
|
+
using(file, "animated", "text/html").
|
79
|
+
spoofed?
|
80
|
+
end
|
81
|
+
|
82
|
+
it "rejects the file" do
|
83
|
+
assert spoofed?
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
61
87
|
it "does not reject if content_type is empty but otherwise checks out" do
|
62
88
|
file = File.open(fixture_file("empty.html"))
|
63
|
-
assert !
|
89
|
+
assert !Paperclip::MediaTypeSpoofDetector.using(file, "empty.html", "").spoofed?
|
64
90
|
end
|
65
91
|
|
66
|
-
it
|
92
|
+
it "does allow array as :content_type_mappings" do
|
67
93
|
begin
|
68
94
|
Paperclip.options[:content_type_mappings] = {
|
69
|
-
html: [
|
95
|
+
html: ["binary", "text/html"]
|
70
96
|
}
|
71
|
-
file = File.open(fixture_file(
|
72
|
-
spoofed = Paperclip::MediaTypeSpoofDetector
|
73
|
-
|
97
|
+
file = File.open(fixture_file("empty.html"))
|
98
|
+
spoofed = Paperclip::MediaTypeSpoofDetector.
|
99
|
+
using(file, "empty.html", "text/html").spoofed?
|
74
100
|
assert !spoofed
|
75
101
|
ensure
|
76
102
|
Paperclip.options[:content_type_mappings] = {}
|
@@ -82,12 +108,12 @@ describe Paperclip::MediaTypeSpoofDetector do
|
|
82
108
|
let(:detector) { Paperclip::MediaTypeSpoofDetector.new(file, "html", "") }
|
83
109
|
|
84
110
|
it "does work with the output of old versions of file" do
|
85
|
-
Paperclip.
|
111
|
+
allow(Paperclip).to receive(:run).and_return("text/html charset=us-ascii")
|
86
112
|
expect(detector.send(:type_from_file_command)).to eq("text/html")
|
87
113
|
end
|
88
114
|
|
89
115
|
it "does work with the output of new versions of file" do
|
90
|
-
Paperclip.
|
116
|
+
allow(Paperclip).to receive(:run).and_return("text/html; charset=us-ascii")
|
91
117
|
expect(detector.send(:type_from_file_command)).to eq("text/html")
|
92
118
|
end
|
93
119
|
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe "Metaclasses" do
|
4
4
|
context "A meta-class of dummy" do
|
5
5
|
if active_support_version >= "4.1" || ruby_version < "2.1"
|
6
6
|
before do
|
@@ -21,7 +21,7 @@ describe 'Metaclasses' do
|
|
21
21
|
rebuild_meta_class_of(@dummy)
|
22
22
|
|
23
23
|
assert_nothing_raised do
|
24
|
-
@dummy.avatar = File.new(fixture_file("5k.png"),
|
24
|
+
@dummy.avatar = File.new(fixture_file("5k.png"), "rb")
|
25
25
|
end
|
26
26
|
assert @dummy.save
|
27
27
|
end
|
@@ -1,59 +1,63 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe "Missing Attachment Styles" do
|
4
4
|
before do
|
5
5
|
Paperclip::AttachmentRegistry.clear
|
6
6
|
end
|
7
7
|
|
8
8
|
after do
|
9
|
-
|
9
|
+
begin
|
10
|
+
File.unlink(Paperclip.registered_attachments_styles_path)
|
11
|
+
rescue StandardError
|
12
|
+
nil
|
13
|
+
end
|
10
14
|
end
|
11
15
|
|
12
16
|
it "enables to get and set path to registered styles file" do
|
13
|
-
assert_equal ROOT.join(
|
14
|
-
Paperclip.registered_attachments_styles_path =
|
15
|
-
assert_equal
|
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
|
16
20
|
Paperclip.registered_attachments_styles_path = nil
|
17
|
-
assert_equal ROOT.join(
|
21
|
+
assert_equal ROOT.join("tmp/public/system/paperclip_attachments.yml").to_s, Paperclip.registered_attachments_styles_path
|
18
22
|
end
|
19
23
|
|
20
24
|
it "is able to get current attachment styles" do
|
21
25
|
assert_equal Hash.new, Paperclip.send(:current_attachments_styles)
|
22
|
-
rebuild_model styles: {croppable:
|
23
|
-
expected_hash = { Dummy: {avatar: [:big, :croppable]}}
|
26
|
+
rebuild_model styles: { croppable: "600x600>", big: "1000x1000>" }
|
27
|
+
expected_hash = { Dummy: { avatar: [:big, :croppable] } }
|
24
28
|
assert_equal expected_hash, Paperclip.send(:current_attachments_styles)
|
25
29
|
end
|
26
30
|
|
27
31
|
it "is able to save current attachment styles for further comparison" do
|
28
|
-
rebuild_model styles: {croppable:
|
32
|
+
rebuild_model styles: { croppable: "600x600>", big: "1000x1000>" }
|
29
33
|
Paperclip.save_current_attachments_styles!
|
30
|
-
expected_hash = { Dummy: {avatar: [:big, :croppable]}}
|
34
|
+
expected_hash = { Dummy: { avatar: [:big, :croppable] } }
|
31
35
|
assert_equal expected_hash, YAML.load_file(Paperclip.registered_attachments_styles_path)
|
32
36
|
end
|
33
37
|
|
34
38
|
it "is able to read registered attachment styles from file" do
|
35
|
-
rebuild_model styles: {croppable:
|
39
|
+
rebuild_model styles: { croppable: "600x600>", big: "1000x1000>" }
|
36
40
|
Paperclip.save_current_attachments_styles!
|
37
|
-
expected_hash = { Dummy: {avatar: [:big, :croppable]}}
|
41
|
+
expected_hash = { Dummy: { avatar: [:big, :croppable] } }
|
38
42
|
assert_equal expected_hash, Paperclip.send(:get_registered_attachments_styles)
|
39
43
|
end
|
40
44
|
|
41
45
|
it "is able to calculate differences between registered styles and current styles" do
|
42
|
-
rebuild_model styles: {croppable:
|
46
|
+
rebuild_model styles: { croppable: "600x600>", big: "1000x1000>" }
|
43
47
|
Paperclip.save_current_attachments_styles!
|
44
|
-
rebuild_model styles: {thumb:
|
45
|
-
expected_hash = { Dummy: {avatar: [:export, :thumb]} }
|
48
|
+
rebuild_model styles: { thumb: "x100", export: "x400>", croppable: "600x600>", big: "1000x1000>" }
|
49
|
+
expected_hash = { Dummy: { avatar: [:export, :thumb] } }
|
46
50
|
assert_equal expected_hash, Paperclip.missing_attachments_styles
|
47
51
|
|
48
52
|
ActiveRecord::Base.connection.create_table :books, force: true
|
49
53
|
class ::Book < ActiveRecord::Base
|
50
|
-
has_attached_file :cover, styles: {small:
|
51
|
-
has_attached_file :sample, styles: {thumb:
|
54
|
+
has_attached_file :cover, styles: { small: "x100", large: "1000x1000>" }
|
55
|
+
has_attached_file :sample, styles: { thumb: "x100" }
|
52
56
|
end
|
53
57
|
|
54
58
|
expected_hash = {
|
55
|
-
Dummy: {avatar: [:export, :thumb]},
|
56
|
-
Book: {sample: [:thumb], cover: [:large, :small]}
|
59
|
+
Dummy: { avatar: [:export, :thumb] },
|
60
|
+
Book: { sample: [:thumb], cover: [:large, :small] }
|
57
61
|
}
|
58
62
|
assert_equal expected_hash, Paperclip.missing_attachments_styles
|
59
63
|
Paperclip.save_current_attachments_styles!
|
@@ -61,15 +65,15 @@ describe 'Missing Attachment Styles' do
|
|
61
65
|
end
|
62
66
|
|
63
67
|
it "is able to calculate differences when a new attachment is added to a model" do
|
64
|
-
rebuild_model styles: {croppable:
|
68
|
+
rebuild_model styles: { croppable: "600x600>", big: "1000x1000>" }
|
65
69
|
Paperclip.save_current_attachments_styles!
|
66
70
|
|
67
71
|
class ::Dummy
|
68
|
-
has_attached_file :photo, styles: {small:
|
72
|
+
has_attached_file :photo, styles: { small: "x100", large: "1000x1000>" }
|
69
73
|
end
|
70
74
|
|
71
75
|
expected_hash = {
|
72
|
-
Dummy: {photo: [:large, :small]}
|
76
|
+
Dummy: { photo: [:large, :small] }
|
73
77
|
}
|
74
78
|
assert_equal expected_hash, Paperclip.missing_attachments_styles
|
75
79
|
Paperclip.save_current_attachments_styles!
|
@@ -78,7 +82,7 @@ describe 'Missing Attachment Styles' do
|
|
78
82
|
|
79
83
|
# It's impossible to build styles hash without loading from database whole bunch of records
|
80
84
|
it "skips lambda-styles" do
|
81
|
-
rebuild_model styles: lambda{ |attachment| attachment.instance.other ==
|
85
|
+
rebuild_model styles: lambda { |attachment| attachment.instance.other == "a" ? { thumb: "50x50#" } : { large: "400x400" } }
|
82
86
|
assert_equal Hash.new, Paperclip.send(:current_attachments_styles)
|
83
87
|
end
|
84
88
|
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe Paperclip do
|
4
4
|
context ".run" do
|
5
5
|
before do
|
6
6
|
Paperclip.options[:log_command] = false
|
7
|
-
Terrapin::CommandLine.
|
7
|
+
expect(Terrapin::CommandLine).to receive(:new).with("convert", "stuff", {}).and_return(double(run: nil))
|
8
8
|
@original_command_line_path = Terrapin::CommandLine.path
|
9
9
|
end
|
10
10
|
|
@@ -24,7 +24,7 @@ describe Paperclip do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it "does not duplicate Terrapin::CommandLine.path on multiple runs" do
|
27
|
-
Terrapin::CommandLine.
|
27
|
+
expect(Terrapin::CommandLine).to receive(:new).with("convert", "more_stuff", {}).and_return(double(run: nil))
|
28
28
|
Terrapin::CommandLine.path = nil
|
29
29
|
Paperclip.options[:command_path] = "/opt/my_app/bin"
|
30
30
|
Paperclip.run("convert", "stuff")
|
@@ -35,7 +35,7 @@ describe Paperclip do
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
it
|
38
|
+
it "does not raise errors when doing a lot of running" do
|
39
39
|
Paperclip.options[:command_path] = ["/usr/local/bin"] * 1024
|
40
40
|
Terrapin::CommandLine.path = "/something/else"
|
41
41
|
100.times do |x|
|
@@ -56,21 +56,21 @@ describe Paperclip do
|
|
56
56
|
|
57
57
|
it "does not raise an error when log is called" do
|
58
58
|
silence_stream(STDOUT) do
|
59
|
-
Paperclip.log(
|
59
|
+
Paperclip.log("something")
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
63
63
|
context "Calling Paperclip.run with a logger" do
|
64
64
|
it "passes the defined logger if :log_command is set" do
|
65
65
|
Paperclip.options[:log_command] = true
|
66
|
-
Terrapin::CommandLine.
|
66
|
+
expect(Terrapin::CommandLine).to receive(:new).with("convert", "stuff", logger: Paperclip.logger).and_return(double(run: nil))
|
67
67
|
Paperclip.run("convert", "stuff")
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
71
|
context "Paperclip.each_instance_with_attachment" do
|
72
72
|
before do
|
73
|
-
@file = File.new(fixture_file("5k.png"),
|
73
|
+
@file = File.new(fixture_file("5k.png"), "rb")
|
74
74
|
d1 = Dummy.create(avatar: @file)
|
75
75
|
d2 = Dummy.create
|
76
76
|
d3 = Dummy.create(avatar: @file)
|
@@ -89,7 +89,7 @@ describe Paperclip do
|
|
89
89
|
end
|
90
90
|
|
91
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) }
|
92
|
+
assert_raises(LoadError) { Paperclip.processor(:boogey_man) }
|
93
93
|
end
|
94
94
|
|
95
95
|
it "returns a class when sent #processor and the name of a class under Paperclip" do
|
@@ -112,7 +112,7 @@ describe Paperclip do
|
|
112
112
|
context "An ActiveRecord model with an 'avatar' attachment" do
|
113
113
|
before do
|
114
114
|
rebuild_model path: "tmp/:class/omg/:style.:extension"
|
115
|
-
@file = File.new(fixture_file("5k.png"),
|
115
|
+
@file = File.new(fixture_file("5k.png"), "rb")
|
116
116
|
end
|
117
117
|
|
118
118
|
after { @file.close }
|
@@ -138,7 +138,11 @@ describe Paperclip do
|
|
138
138
|
|
139
139
|
after do
|
140
140
|
SubDummy.delete_all
|
141
|
-
|
141
|
+
begin
|
142
|
+
Object.send(:remove_const, "SubDummy")
|
143
|
+
rescue StandardError
|
144
|
+
nil
|
145
|
+
end
|
142
146
|
end
|
143
147
|
end
|
144
148
|
|
@@ -171,7 +175,7 @@ describe Paperclip do
|
|
171
175
|
context "configuring a custom processor" do
|
172
176
|
before do
|
173
177
|
@freedom_processor = Class.new do
|
174
|
-
def make(file,
|
178
|
+
def make(file, _options = {}, _attachment = nil)
|
175
179
|
file
|
176
180
|
end
|
177
181
|
end.new
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
|
-
describe
|
4
|
-
it
|
3
|
+
describe "Plural cache" do
|
4
|
+
it "caches pluralizations" do
|
5
5
|
cache = Paperclip::Interpolations::PluralCache.new
|
6
6
|
symbol = :box
|
7
7
|
|
@@ -10,8 +10,8 @@ describe 'Plural cache' do
|
|
10
10
|
expect(first).to equal(second)
|
11
11
|
end
|
12
12
|
|
13
|
-
it
|
14
|
-
class BigBox
|
13
|
+
it "caches pluralizations and underscores" do
|
14
|
+
class BigBox; end
|
15
15
|
cache = Paperclip::Interpolations::PluralCache.new
|
16
16
|
klass = BigBox
|
17
17
|
|
@@ -20,15 +20,15 @@ describe 'Plural cache' do
|
|
20
20
|
expect(first).to equal(second)
|
21
21
|
end
|
22
22
|
|
23
|
-
it
|
23
|
+
it "pluralizes words" do
|
24
24
|
cache = Paperclip::Interpolations::PluralCache.new
|
25
25
|
symbol = :box
|
26
26
|
|
27
27
|
expect(cache.pluralize_symbol(symbol)).to eq("boxes")
|
28
28
|
end
|
29
29
|
|
30
|
-
it
|
31
|
-
class BigBox
|
30
|
+
it "pluralizes and underscore class names" do
|
31
|
+
class BigBox; end
|
32
32
|
cache = Paperclip::Interpolations::PluralCache.new
|
33
33
|
klass = BigBox
|
34
34
|
|
@@ -1,54 +1,54 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe Paperclip::ProcessorHelpers do
|
4
|
-
describe
|
5
|
-
context
|
6
|
-
it
|
7
|
-
pathname = Pathname.new(
|
8
|
-
main_path =
|
9
|
-
alternate_path =
|
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
10
|
|
11
|
-
Rails.
|
12
|
-
File.
|
13
|
-
File.
|
14
|
-
File.
|
15
|
-
File.
|
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
16
|
|
17
|
-
Paperclip.
|
17
|
+
expect(Paperclip).to receive(:require).with(main_path)
|
18
18
|
|
19
19
|
Paperclip.load_processor(:custom)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
context
|
24
|
-
it
|
25
|
-
pathname = Pathname.new(
|
26
|
-
main_path =
|
27
|
-
alternate_path =
|
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
28
|
|
29
|
-
Rails.
|
30
|
-
File.
|
31
|
-
File.
|
32
|
-
File.
|
33
|
-
File.
|
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
34
|
|
35
|
-
Paperclip.
|
35
|
+
expect(Paperclip).to receive(:require).with(alternate_path)
|
36
36
|
|
37
37
|
Paperclip.load_processor(:custom)
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
context
|
42
|
-
it
|
43
|
-
pathname = Pathname.new(
|
44
|
-
main_path =
|
45
|
-
alternate_path =
|
46
|
-
|
47
|
-
Rails.
|
48
|
-
File.
|
49
|
-
File.
|
50
|
-
File.
|
51
|
-
File.
|
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
52
|
|
53
53
|
assert_raises(LoadError) { Paperclip.processor(:custom) }
|
54
54
|
end
|
@@ -1,26 +1,26 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe Paperclip::Processor do
|
4
4
|
it "instantiates and call #make when sent #make to the class" do
|
5
|
-
processor =
|
6
|
-
processor.
|
7
|
-
Paperclip::Processor.
|
5
|
+
processor = double
|
6
|
+
expect(processor).to receive(:make)
|
7
|
+
expect(Paperclip::Processor).to receive(:new).with(:one, :two, :three).and_return(processor)
|
8
8
|
Paperclip::Processor.make(:one, :two, :three)
|
9
9
|
end
|
10
10
|
|
11
11
|
context "Calling #convert" do
|
12
12
|
it "runs the convert command with Terrapin" do
|
13
13
|
Paperclip.options[:log_command] = false
|
14
|
-
Terrapin::CommandLine.
|
15
|
-
Paperclip::Processor.new(
|
14
|
+
expect(Terrapin::CommandLine).to receive(:new).with("convert", "stuff", {}).and_return(double(run: nil))
|
15
|
+
Paperclip::Processor.new("filename").convert("stuff")
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
context "Calling #identify" do
|
20
20
|
it "runs the identify command with Terrapin" do
|
21
21
|
Paperclip.options[:log_command] = false
|
22
|
-
Terrapin::CommandLine.
|
23
|
-
Paperclip::Processor.new(
|
22
|
+
expect(Terrapin::CommandLine).to receive(:new).with("identify", "stuff", {}).and_return(double(run: nil))
|
23
|
+
Paperclip::Processor.new("filename").identify("stuff")
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -1,7 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe Paperclip::RailsEnvironment do
|
4
|
-
|
5
4
|
it "returns nil when Rails isn't defined" do
|
6
5
|
resetting_rails_to(nil) do
|
7
6
|
expect(Paperclip::RailsEnvironment.get).to be_nil
|
@@ -21,13 +20,11 @@ describe Paperclip::RailsEnvironment do
|
|
21
20
|
end
|
22
21
|
|
23
22
|
def resetting_rails_to(new_value)
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
Object.const_set("Rails", previous_rails)
|
31
|
-
end
|
23
|
+
previous_rails = Object.send(:remove_const, "Rails")
|
24
|
+
Object.const_set("Rails", new_value) unless new_value.nil?
|
25
|
+
yield
|
26
|
+
ensure
|
27
|
+
Object.send(:remove_const, "Rails") if Object.const_defined?("Rails")
|
28
|
+
Object.const_set("Rails", previous_rails)
|
32
29
|
end
|
33
30
|
end
|