paperclip 4.3.6 → 4.3.7

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

Potentially problematic release.


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

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ab7608623c35bf152d8a5277f17938d75e29062a
4
- data.tar.gz: 9522d62f5f590d9022abc2a086c5b1c7387a4eb0
3
+ metadata.gz: 43295d174585b0f901e4582c9a187ac89c8bfcdf
4
+ data.tar.gz: 48a869b66081613bc8ecef28d9b311007f61f082
5
5
  SHA512:
6
- metadata.gz: fc30de9ee1182acb5d59ec0f172b5b309b55032fce3b14f466545c3f86d5e4e29deef045673fbd585a5a7a2268ba0172a8a87103135cb5236ace5058ed78fdab
7
- data.tar.gz: 6a37ffebe6bfd71e8f4c8937adf6a4cafdf31365acd305274a4b38c631ad4ade53a5aa4bc2b1584a0716a3c2a048ddea0212e42edbbe2392f5e69c496b27bad5
6
+ metadata.gz: 88697737772a0e776549b80dcf4b45e42aeb57ec3cf3432827356d410c9e2abaf3bb5072be70728798c04bc5ec844715e14de5d013dbe2debe49601c73e4ad1e
7
+ data.tar.gz: 2ca1c276224bf3134d9df3a3df41a69ff4e19c35374043a2fa3c634529548875bc32b25cfc0bf61b58d792d01f0b740c90c849a794a520b97671e9efe96de3e9
data/NEWS CHANGED
@@ -1,3 +1,9 @@
1
+ 4.3.7 (7/1/2016):
2
+
3
+ * Add deprecation warnings
4
+ * Improvement: Add `fog_options` configuration to send options to fog when storing files.
5
+ * Improvement: the `URI adapter` now uses the content-disposition header to name the downloaded file.
6
+
1
7
  4.3.6 (3/13/2016):
2
8
 
3
9
  * Bug Fix: When a spoofed media type is detected, megabytes of mime-types info are added to logs. See https://cwe.mitre.org/data/definitions/779.html.
data/lib/paperclip.rb CHANGED
@@ -56,6 +56,7 @@ require 'paperclip/has_attached_file'
56
56
  require 'paperclip/attachment_registry'
57
57
  require 'paperclip/filename_cleaner'
58
58
  require 'paperclip/rails_environment'
59
+ require "paperclip/deprecations"
59
60
 
60
61
  begin
61
62
  # Use mime/types/columnar if available, for reduced memory usage
@@ -191,6 +192,7 @@ module Paperclip
191
192
  # end
192
193
  # end
193
194
  def has_attached_file(name, options = {})
195
+ Paperclip::Deprecations.check
194
196
  HasAttachedFile.define_on(self, name, options)
195
197
  end
196
198
  end
@@ -0,0 +1,42 @@
1
+ require "active_support/deprecation"
2
+
3
+ module Paperclip
4
+ class Deprecations
5
+ class << self
6
+ def check
7
+ warn_aws_sdk_v1 if aws_sdk_v1?
8
+ warn_outdated_rails if active_model_version < "4.2"
9
+ end
10
+
11
+ private
12
+
13
+ def active_model_version
14
+ ::ActiveModel::VERSION::STRING
15
+ end
16
+
17
+ def aws_sdk_v1?
18
+ defined?(::AWS) && aws_sdk_version < "2"
19
+ end
20
+
21
+ def warn_aws_sdk_v1
22
+ warn "[paperclip] [deprecation] AWS SDK v1 has been deprecated in " \
23
+ "paperclip 5. Please consider upgrading to AWS 2 before " \
24
+ "upgrading paperclip."
25
+ end
26
+
27
+ def warn_outdated_rails
28
+ warn "[paperclip] [deprecation] Rails 3.2 and 4.1 are unsupported as " \
29
+ "of Rails 5 release. Please upgrade to Rails 4.2 before " \
30
+ "upgrading paperclip."
31
+ end
32
+
33
+ def aws_sdk_version
34
+ ::AWS::VERSION
35
+ end
36
+
37
+ def warn(message)
38
+ ActiveSupport::Deprecation.warn(message)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -2,6 +2,8 @@ require 'open-uri'
2
2
 
3
3
  module Paperclip
4
4
  class UriAdapter < AbstractAdapter
5
+ attr_writer :content_type
6
+
5
7
  def initialize(target)
6
8
  @target = target
7
9
  @content = download_content
@@ -9,23 +11,40 @@ module Paperclip
9
11
  @tempfile = copy_to_tempfile(@content)
10
12
  end
11
13
 
12
- attr_writer :content_type
13
-
14
14
  private
15
15
 
16
- def download_content
17
- open(@target)
16
+ def cache_current_values
17
+ self.content_type = content_type_from_content || "text/html"
18
+
19
+ self.original_filename = filename_from_content_disposition ||
20
+ filename_from_path ||
21
+ default_filename
22
+ @size = @content.size
18
23
  end
19
24
 
20
- def cache_current_values
21
- @original_filename = @target.path.split("/").last
22
- @original_filename ||= "index.html"
23
- self.original_filename = @original_filename.strip
25
+ def content_type_from_content
26
+ if @content.respond_to?(:content_type)
27
+ @content.content_type
28
+ end
29
+ end
24
30
 
25
- @content_type = @content.content_type if @content.respond_to?(:content_type)
26
- @content_type ||= "text/html"
31
+ def filename_from_content_disposition
32
+ if @content.meta.has_key?("content-disposition")
33
+ @content.meta["content-disposition"].
34
+ match(/filename="([^"]*)"/)[1]
35
+ end
36
+ end
27
37
 
28
- @size = @content.size
38
+ def filename_from_path
39
+ @target.path.split("/").last
40
+ end
41
+
42
+ def default_filename
43
+ "index.html"
44
+ end
45
+
46
+ def download_content
47
+ open(@target)
29
48
  end
30
49
 
31
50
  def copy_to_tempfile(src)
@@ -33,6 +33,10 @@ module Paperclip
33
33
  # that is the alias to the S3 domain of your bucket, e.g.
34
34
  # 'http://images.example.com'. This can also be used in
35
35
  # conjunction with Cloudfront (http://aws.amazon.com/cloudfront)
36
+ # * +fog_options+: (optional) A hash of options that are passed
37
+ # to fog when the file is created. For example, you could set
38
+ # the multipart-chunk size to 100MB with a hash:
39
+ # { :multipart_chunk_size => 104857600 }
36
40
 
37
41
  module Fog
38
42
  def self.extended base
@@ -98,12 +102,14 @@ module Paperclip
98
102
  log("saving #{path(style)}")
99
103
  retried = false
100
104
  begin
101
- directory.files.create(fog_file.merge(
105
+ attributes = fog_file.merge(
102
106
  :body => file,
103
107
  :key => path(style),
104
108
  :public => fog_public(style),
105
109
  :content_type => file.content_type
106
- ))
110
+ )
111
+ attributes.merge!(@options[:fog_options]) if @options[:fog_options]
112
+ directory.files.create(attributes)
107
113
  rescue Excon::Errors::NotFound
108
114
  raise if retried
109
115
  retried = true
@@ -1,3 +1,3 @@
1
1
  module Paperclip
2
- VERSION = "4.3.6" unless defined? Paperclip::VERSION
2
+ VERSION = "4.3.7".freeze unless defined? Paperclip::VERSION
3
3
  end
@@ -0,0 +1,65 @@
1
+ require "spec_helper"
2
+ require "aws-sdk"
3
+ require "active_support/testing/deprecation"
4
+
5
+ describe Paperclip::Deprecations do
6
+ include ActiveSupport::Testing::Deprecation
7
+
8
+ describe ".check" do
9
+ before do
10
+ ActiveSupport::Deprecation.silenced = false
11
+ end
12
+
13
+ after do
14
+ ActiveSupport::Deprecation.silenced = true
15
+ end
16
+
17
+ context "when active model version is < 4.2" do
18
+ it "displays deprecation warning" do
19
+ Paperclip::Deprecations.stubs(:active_model_version).returns("4.1")
20
+
21
+ assert_deprecated("Rails 3.2 and 4.1 are unsupported") do
22
+ Paperclip::Deprecations.check
23
+ end
24
+ end
25
+ end
26
+
27
+ context "when active model version is 4.2" do
28
+ it "do not display deprecation warning" do
29
+ Paperclip::Deprecations.stubs(:active_model_version).returns("4.2")
30
+
31
+ assert_not_deprecated do
32
+ Paperclip::Deprecations.check
33
+ end
34
+ end
35
+ end
36
+
37
+ context "when aws sdk version is < 2" do
38
+ before do
39
+ ::AWS.stub! if !defined?(::AWS)
40
+ end
41
+
42
+ it "displays deprecation warning" do
43
+ Paperclip::Deprecations.stubs(:aws_sdk_version).returns("1.68.0")
44
+
45
+ assert_deprecated("AWS SDK v1 has been deprecated") do
46
+ Paperclip::Deprecations.check
47
+ end
48
+ end
49
+ end
50
+
51
+ context "when aws sdk version is 2" do
52
+ before do
53
+ ::AWS.stub! if !defined?(::AWS)
54
+ end
55
+
56
+ it "do not display deprecation warning" do
57
+ Paperclip::Deprecations.stubs(:aws_sdk_version).returns("2.0.0")
58
+
59
+ assert_not_deprecated do
60
+ Paperclip::Deprecations.check
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -1,11 +1,16 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Paperclip::HttpUrlProxyAdapter do
4
+ before do
5
+ @open_return = StringIO.new("xxx")
6
+ @open_return.stubs(:content_type).returns("image/png")
7
+ @open_return.stubs(:meta).returns({})
8
+ Paperclip::HttpUrlProxyAdapter.any_instance.
9
+ stubs(:download_content).returns(@open_return)
10
+ end
11
+
4
12
  context "a new instance" do
5
13
  before do
6
- @open_return = StringIO.new("xxx")
7
- @open_return.stubs(:content_type).returns("image/png")
8
- Paperclip::HttpUrlProxyAdapter.any_instance.stubs(:download_content).returns(@open_return)
9
14
  @url = "http://thoughtbot.com/images/thoughtbot-logo.png"
10
15
  @subject = Paperclip.io_adapters.for(@url)
11
16
  end
@@ -60,7 +65,6 @@ describe Paperclip::HttpUrlProxyAdapter do
60
65
 
61
66
  context "a url with query params" do
62
67
  before do
63
- Paperclip::HttpUrlProxyAdapter.any_instance.stubs(:download_content).returns(StringIO.new("x"))
64
68
  @url = "https://github.com/thoughtbot/paperclip?file=test"
65
69
  @subject = Paperclip.io_adapters.for(@url)
66
70
  end
@@ -76,7 +80,6 @@ describe Paperclip::HttpUrlProxyAdapter do
76
80
 
77
81
  context "a url with restricted characters in the filename" do
78
82
  before do
79
- Paperclip::HttpUrlProxyAdapter.any_instance.stubs(:download_content).returns(StringIO.new("x"))
80
83
  @url = "https://github.com/thoughtbot/paper:clip.jpg"
81
84
  @subject = Paperclip.io_adapters.for(@url)
82
85
  end
@@ -1,11 +1,19 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Paperclip::UriAdapter do
4
+ let(:content_type) { "image/png" }
5
+ let(:meta) { {} }
6
+
7
+ before do
8
+ @open_return = StringIO.new("xxx")
9
+ @open_return.stubs(:content_type).returns(content_type)
10
+ @open_return.stubs(:meta).returns(meta)
11
+ Paperclip::UriAdapter.any_instance.
12
+ stubs(:download_content).returns(@open_return)
13
+ end
14
+
4
15
  context "a new instance" do
5
16
  before do
6
- @open_return = StringIO.new("xxx")
7
- @open_return.stubs(:content_type).returns("image/png")
8
- Paperclip::UriAdapter.any_instance.stubs(:download_content).returns(@open_return)
9
17
  @uri = URI.parse("http://thoughtbot.com/images/thoughtbot-logo.png")
10
18
  @subject = Paperclip.io_adapters.for(@uri)
11
19
  end
@@ -56,8 +64,9 @@ describe Paperclip::UriAdapter do
56
64
  end
57
65
 
58
66
  context "a directory index url" do
67
+ let(:content_type) { "text/html" }
68
+
59
69
  before do
60
- Paperclip::UriAdapter.any_instance.stubs(:download_content).returns(StringIO.new("xxx"))
61
70
  @uri = URI.parse("http://thoughtbot.com")
62
71
  @subject = Paperclip.io_adapters.for(@uri)
63
72
  end
@@ -73,7 +82,6 @@ describe Paperclip::UriAdapter do
73
82
 
74
83
  context "a url with query params" do
75
84
  before do
76
- Paperclip::UriAdapter.any_instance.stubs(:download_content).returns(StringIO.new("xxx"))
77
85
  @uri = URI.parse("https://github.com/thoughtbot/paperclip?file=test")
78
86
  @subject = Paperclip.io_adapters.for(@uri)
79
87
  end
@@ -83,9 +91,26 @@ describe Paperclip::UriAdapter do
83
91
  end
84
92
  end
85
93
 
94
+ context "a url with content disposition headers" do
95
+ let(:file_name) { "test_document.pdf" }
96
+ let(:meta) do
97
+ {
98
+ "content-disposition" => "attachment; filename=\"#{file_name}\";",
99
+ }
100
+ end
101
+
102
+ before do
103
+ @uri = URI.parse("https://github.com/thoughtbot/paperclip?file=test")
104
+ @subject = Paperclip.io_adapters.for(@uri)
105
+ end
106
+
107
+ it "returns a file name" do
108
+ assert_equal file_name, @subject.original_filename
109
+ end
110
+ end
111
+
86
112
  context "a url with restricted characters in the filename" do
87
113
  before do
88
- Paperclip::UriAdapter.any_instance.stubs(:download_content).returns(StringIO.new("xxx"))
89
114
  @uri = URI.parse("https://github.com/thoughtbot/paper:clip.jpg")
90
115
  @subject = Paperclip.io_adapters.for(@uri)
91
116
  end
@@ -109,6 +109,7 @@ describe Paperclip do
109
109
 
110
110
  context "An ActiveRecord model with an 'avatar' attachment" do
111
111
  before do
112
+ Paperclip::Deprecations.stubs(:check)
112
113
  rebuild_model path: "tmp/:class/omg/:style.:extension"
113
114
  @file = File.new(fixture_file("5k.png"), 'rb')
114
115
  end
@@ -150,6 +151,10 @@ describe Paperclip do
150
151
  end
151
152
  end
152
153
 
154
+ it "calls Paperclip::Deprecations.check" do
155
+ expect(Paperclip::Deprecations).to have_received(:check)
156
+ end
157
+
153
158
  context "with a subclass" do
154
159
  before do
155
160
  class ::SubDummy < Dummy; end
@@ -484,6 +484,25 @@ describe Paperclip::Storage::Fog do
484
484
  assert_equal @dummy.avatar.fog_credentials, @dynamic_fog_credentials
485
485
  end
486
486
  end
487
+
488
+ context "with custom fog_options" do
489
+ before do
490
+ rebuild_model(
491
+ @options.merge(fog_options: { multipart_chunk_size: 104857600 }),
492
+ )
493
+ @dummy = Dummy.new
494
+ @dummy.avatar = @file
495
+ end
496
+
497
+ it "applies the options to the fog #create call" do
498
+ files = stub
499
+ @dummy.avatar.stubs(:directory).returns stub(files: files)
500
+ files.expects(:create).with(
501
+ has_entries(multipart_chunk_size: 104857600),
502
+ )
503
+ @dummy.save
504
+ end
505
+ end
487
506
  end
488
507
 
489
508
  end
@@ -0,0 +1,9 @@
1
+ RSpec.configure do |config|
2
+ config.before(:all) do
3
+ ActiveSupport::Deprecation.silenced = true
4
+ end
5
+ config.before(:each) do
6
+ Paperclip::Deprecations.stubs(:active_model_version).returns("4.2")
7
+ Paperclip::Deprecations.stubs(:aws_sdk_version).returns("2.0.0")
8
+ end
9
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paperclip
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.3.6
4
+ version: 4.3.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Yurek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-13 00:00:00.000000000 Z
11
+ date: 2016-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -429,6 +429,7 @@ files:
429
429
  - lib/paperclip/attachment_registry.rb
430
430
  - lib/paperclip/callbacks.rb
431
431
  - lib/paperclip/content_type_detector.rb
432
+ - lib/paperclip/deprecations.rb
432
433
  - lib/paperclip/errors.rb
433
434
  - lib/paperclip/file_command_content_type_detector.rb
434
435
  - lib/paperclip/filename_cleaner.rb
@@ -499,6 +500,7 @@ files:
499
500
  - spec/paperclip/attachment_registry_spec.rb
500
501
  - spec/paperclip/attachment_spec.rb
501
502
  - spec/paperclip/content_type_detector_spec.rb
503
+ - spec/paperclip/deprecations_spec.rb
502
504
  - spec/paperclip/file_command_content_type_detector_spec.rb
503
505
  - spec/paperclip/filename_cleaner_spec.rb
504
506
  - spec/paperclip/geometry_detector_spec.rb
@@ -550,6 +552,7 @@ files:
550
552
  - spec/paperclip/validators_spec.rb
551
553
  - spec/spec_helper.rb
552
554
  - spec/support/assertions.rb
555
+ - spec/support/deprecations.rb
553
556
  - spec/support/fake_model.rb
554
557
  - spec/support/fake_rails.rb
555
558
  - spec/support/fixtures/12k.png
@@ -600,7 +603,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
600
603
  requirements:
601
604
  - ImageMagick
602
605
  rubyforge_project:
603
- rubygems_version: 2.5.1
606
+ rubygems_version: 2.6.2
604
607
  signing_key:
605
608
  specification_version: 4
606
609
  summary: File attachments as attributes for ActiveRecord
@@ -628,6 +631,7 @@ test_files:
628
631
  - spec/paperclip/attachment_registry_spec.rb
629
632
  - spec/paperclip/attachment_spec.rb
630
633
  - spec/paperclip/content_type_detector_spec.rb
634
+ - spec/paperclip/deprecations_spec.rb
631
635
  - spec/paperclip/file_command_content_type_detector_spec.rb
632
636
  - spec/paperclip/filename_cleaner_spec.rb
633
637
  - spec/paperclip/geometry_detector_spec.rb
@@ -679,6 +683,7 @@ test_files:
679
683
  - spec/paperclip/validators_spec.rb
680
684
  - spec/spec_helper.rb
681
685
  - spec/support/assertions.rb
686
+ - spec/support/deprecations.rb
682
687
  - spec/support/fake_model.rb
683
688
  - spec/support/fake_rails.rb
684
689
  - spec/support/fixtures/12k.png