kt-paperclip 7.1.1 → 7.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 669710c8c7ce2b2bc967e6e4896e8baf9bf3ed5c091dc793eff8c906152b188a
4
- data.tar.gz: a8af06de8724aaf50001704dfb4a58acfc69e68a579054c0d047562cca4acdff
3
+ metadata.gz: 206e4e7dd6b6f2ad56c7a0395e9b845a8033c7efa20f19f4ef5c33d09edcbf39
4
+ data.tar.gz: 492bfb36e312bd31c4511a91f6b0b4d779d31b5d098f616cb75871c2a6a4e527
5
5
  SHA512:
6
- metadata.gz: 688c24cb640ae5b6fdc0f8db3bca0a67f86e033a3920c9eb68d63fd8526a54562ccc70188cbb7daf65c01338ddc6f096144dc4f33fb979412bdd48415051dff5
7
- data.tar.gz: 5476e60a4d1b00139b12f69ca076094f6ea69ad2e8050552dc4695fdfeaca158c89fe496c1c484ed828ee67c3946cdbac1c50e550a6490f239aa35621d11ede9
6
+ metadata.gz: 86a39461732fd83389253cc444168d30a9af957362d90694e04852d86619e3d4ac4a84ea71db0d904784de74d5c5e019bdcec86fc18484fce2e26568cf390d55
7
+ data.tar.gz: 9506c9fc401cb9ccee3dcfe9186ec8787df2abdc3472f947592d7a79a2e6c32e917cc3eae2de1bfc49f366129a67f793c436b69ecafe501aee0fb7c265662bdc
data/NEWS CHANGED
@@ -1,5 +1,6 @@
1
1
  [UNRELEASED]
2
- Issue file delete only once per unique style when nullifying attachment or destroying an object. Avoids triggering a rate limit error on Google Cloud Storage.
2
+ * Improvement: Support file extension names both as symbols and strings for :content_type_mappings
3
+ * Issue file delete only once per unique style when nullifying attachment or destroying an object. Avoids triggering a rate limit error on Google Cloud Storage.
3
4
 
4
5
  7.0.0 (2021-05-28)
5
6
  * Replace `mimemagic` gem with `marcel` due to licensing issues. See https://github.com/kreeti/kt-paperclip/pull/54 for details and limitations
data/README.md CHANGED
@@ -592,9 +592,9 @@ Storage
592
592
 
593
593
  Paperclip ships with 3 storage adapters:
594
594
 
595
- * File Storage
596
- * S3 Storage (via `aws-sdk-s3`)
597
- * Fog Storage
595
+ * File Storage (`storage: :filesystem`)
596
+ * S3 Storage (via `aws-sdk-s3`) (`storage: :s3`)
597
+ * Fog Storage (`storage: :fog`)
598
598
 
599
599
  If you would like to use Paperclip with another storage, you can install these
600
600
  gems along side with Paperclip:
@@ -7,7 +7,7 @@ module Paperclip
7
7
 
8
8
  def make
9
9
  geometry = GeometryParser.new(geometry_string.strip).make
10
- geometry || raise(Errors::NotIdentifiedByImageMagickError.new)
10
+ geometry || raise(Errors::NotIdentifiedByImageMagickError.new("Could not identify image size"))
11
11
  end
12
12
 
13
13
  private
@@ -4,14 +4,15 @@ require "paperclip/schema"
4
4
 
5
5
  module Paperclip
6
6
  module Glue
7
+ LOCALE_PATHS = Dir.glob("#{File.dirname(__FILE__)}/locales/*.{rb,yml}")
8
+
7
9
  def self.included(base)
8
10
  base.extend ClassMethods
9
11
  base.send :include, Callbacks
10
12
  base.send :include, Validators
11
13
  base.send :include, Schema if defined? ActiveRecord::Base
12
14
 
13
- locale_path = Dir.glob(File.dirname(__FILE__) + "/locales/*.{rb,yml}")
14
- I18n.load_path += locale_path unless I18n.load_path.include?(locale_path)
15
+ I18n.load_path += LOCALE_PATHS unless (LOCALE_PATHS - I18n.load_path).empty?
15
16
  end
16
17
  end
17
18
  end
@@ -54,10 +54,14 @@ module Paperclip
54
54
  # Returns the interpolated URL. Will raise an error if the url itself
55
55
  # contains ":url" to prevent infinite recursion. This interpolation
56
56
  # is used in the default :path to ease default specifications.
57
- RIGHT_HERE = "#{__FILE__.gsub(%r{\A\./}, '')}:#{__LINE__ + 3}"
58
57
  def url(attachment, style_name)
59
- raise Errors::InfiniteInterpolationError if caller.any? { |b| b.index(RIGHT_HERE) }
58
+ if Thread.current.thread_variable_get(:kt_paperclip_no_recursion)
59
+ raise Errors::InfiniteInterpolationError
60
+ end
61
+ Thread.current.thread_variable_set(:kt_paperclip_no_recursion, true)
60
62
  attachment.url(style_name, timestamp: false, escape: false)
63
+ ensure
64
+ Thread.current.thread_variable_set(:kt_paperclip_no_recursion, false)
61
65
  end
62
66
 
63
67
  # Returns the timestamp as defined by the <attachment>_updated_at field
@@ -0,0 +1,20 @@
1
+ gd:
2
+ errors:
3
+ messages:
4
+ in_between: "– feumaidh seo a bhith eadar %{min} ’s %{max}"
5
+ spoofed_media_type: "– tha susbaint ann nach eil a-rèir na chaidh aithris"
6
+
7
+ number:
8
+ human:
9
+ storage_units:
10
+ format: "%n %u"
11
+ units:
12
+ byte:
13
+ one: "bhaidht"
14
+ two: "bhaidht"
15
+ few: "baidhtean"
16
+ other: "baidht"
17
+ kb: "KB"
18
+ mb: "MB"
19
+ gb: "GB"
20
+ tb: "TB"
@@ -76,11 +76,14 @@ module Paperclip
76
76
  Paperclip.run("file", "-b --mime :file", file: @file.path).
77
77
  split(/[:;\s]+/).first
78
78
  rescue Terrapin::CommandLineError
79
+ Paperclip.log("Problem getting type from `file` command. Possible that `file` doesn't exist on this system. Content Type validations don't work without this.")
80
+
79
81
  ""
80
82
  end
81
83
 
82
84
  def mapped_content_type
83
- Paperclip.options[:content_type_mappings][filename_extension]
85
+ content_type_mappings = Paperclip.options[:content_type_mappings]
86
+ content_type_mappings[filename_extension] || content_type_mappings[filename_extension.to_s]
84
87
  end
85
88
 
86
89
  def filename_extension
@@ -6,7 +6,7 @@ module Paperclip
6
6
  COLUMNS = { file_name: :string,
7
7
  content_type: :string,
8
8
  file_size: :bigint,
9
- updated_at: :datetime }.freeze
9
+ updated_at: :datetime }
10
10
 
11
11
  def self.included(_base)
12
12
  ActiveRecord::ConnectionAdapters::Table.include TableDefinition
@@ -137,6 +137,9 @@ module Paperclip
137
137
  @s3_headers = {}
138
138
  merge_s3_headers(@options[:s3_headers], @s3_headers, @s3_metadata)
139
139
 
140
+ @s3_acl_enabled = @options[:s3_acl_enabled]
141
+ @s3_acl_enabled = true if @s3_acl_enabled.nil?
142
+
140
143
  @s3_storage_class = set_storage_class(@options[:s3_storage_class])
141
144
 
142
145
  @s3_server_side_encryption = "AES256"
@@ -359,9 +362,12 @@ module Paperclip
359
362
  log("saving #{path(style)}")
360
363
  write_options = {
361
364
  content_type: file.content_type,
362
- acl: s3_permissions(style)
363
365
  }
364
366
 
367
+ if @s3_acl_enabled
368
+ write_options[:acl] = s3_permissions(style)
369
+ end
370
+
365
371
  # add storage class for this style if defined
366
372
  storage_class = s3_storage_class(style)
367
373
  write_options.merge!(storage_class: storage_class) if storage_class
@@ -427,9 +433,9 @@ module Paperclip
427
433
  def find_credentials(creds)
428
434
  case creds
429
435
  when File
430
- YAML::safe_load(ERB.new(File.read(creds.path)).result, [], [], true)
436
+ load_credentials_from_file(creds.path)
431
437
  when String, Pathname
432
- YAML::safe_load(ERB.new(File.read(creds)).result, [], [], true)
438
+ load_credentials_from_file(creds)
433
439
  when Hash
434
440
  creds
435
441
  when NilClass
@@ -439,6 +445,14 @@ module Paperclip
439
445
  end
440
446
  end
441
447
 
448
+ def load_credentials_from_file(path)
449
+ if Gem::Version.new(Psych::VERSION) >= Gem::Version.new("3.1.0")
450
+ YAML::safe_load(ERB.new(File.read(path)).result, aliases: true)
451
+ else
452
+ YAML::safe_load(ERB.new(File.read(path)).result, [], [], true)
453
+ end
454
+ end
455
+
442
456
  def use_secure_protocol?(style_name)
443
457
  s3_protocol(style_name) == "https"
444
458
  end
@@ -35,8 +35,8 @@ module Paperclip
35
35
  options.slice(*AVAILABLE_CHECKS).each do |option, option_value|
36
36
  option_value = option_value.call(record) if option_value.is_a?(Proc)
37
37
  option_value = extract_option_value(option, option_value)
38
- operator = Rails::VERSION::MAJOR >= 7 ? COMPARE_CHECKS[option] : CHECKS[option]
39
-
38
+ operator = ActiveModel::VERSION::MAJOR >= 7 ? COMPARE_CHECKS[option] : CHECKS[option]
39
+
40
40
  unless value.send(operator, option_value)
41
41
  error_message_key = options[:in] ? :in_between : option
42
42
  error_attrs.each do |error_attr_name|
@@ -1,3 +1,3 @@
1
1
  module Paperclip
2
- VERSION = "7.1.1" unless defined?(Paperclip::VERSION)
2
+ VERSION = "7.2.1" unless defined?(Paperclip::VERSION)
3
3
  end
@@ -35,4 +35,13 @@ describe Paperclip::GeometryDetector do
35
35
  Paperclip.options[:use_exif_orientation] = true
36
36
  end
37
37
  end
38
+
39
+ it "raises an exception with a message when the file is not an image" do
40
+ file = fixture_file("text.txt")
41
+ factory = Paperclip::GeometryDetector.new(file)
42
+
43
+ expect do
44
+ factory.make
45
+ end.to raise_error(Paperclip::Errors::NotIdentifiedByImageMagickError, "Could not identify image size")
46
+ end
38
47
  end
@@ -147,23 +147,35 @@ describe Paperclip::Geometry do
147
147
 
148
148
  it "does not generate from a bad file" do
149
149
  file = "/home/This File Does Not Exist.omg"
150
- expect { @geo = Paperclip::Geometry.from_file(file) }.to raise_error(Paperclip::Errors::NotIdentifiedByImageMagickError)
150
+ expect do
151
+ @geo = Paperclip::Geometry.from_file(file)
152
+ end.to raise_error(Paperclip::Errors::NotIdentifiedByImageMagickError,
153
+ "Could not identify image size")
151
154
  end
152
155
 
153
156
  it "does not generate from a blank filename" do
154
157
  file = ""
155
- expect { @geo = Paperclip::Geometry.from_file(file) }.to raise_error(Paperclip::Errors::NotIdentifiedByImageMagickError)
158
+ expect do
159
+ @geo = Paperclip::Geometry.from_file(file)
160
+ end.to raise_error(Paperclip::Errors::NotIdentifiedByImageMagickError,
161
+ "Cannot find the geometry of a file with a blank name")
156
162
  end
157
163
 
158
164
  it "does not generate from a nil file" do
159
165
  file = nil
160
- expect { @geo = Paperclip::Geometry.from_file(file) }.to raise_error(Paperclip::Errors::NotIdentifiedByImageMagickError)
166
+ expect do
167
+ @geo = Paperclip::Geometry.from_file(file)
168
+ end.to raise_error(Paperclip::Errors::NotIdentifiedByImageMagickError,
169
+ "Cannot find the geometry of a file with a blank name")
161
170
  end
162
171
 
163
172
  it "does not generate from a file with no path" do
164
173
  file = double("file", path: "")
165
174
  allow(file).to receive(:respond_to?).with(:path).and_return(true)
166
- expect { @geo = Paperclip::Geometry.from_file(file) }.to raise_error(Paperclip::Errors::NotIdentifiedByImageMagickError)
175
+ expect do
176
+ @geo = Paperclip::Geometry.from_file(file)
177
+ end.to raise_error(Paperclip::Errors::NotIdentifiedByImageMagickError,
178
+ "Cannot find the geometry of a file with a blank name")
167
179
  end
168
180
 
169
181
  it "lets us know when a command isn't found versus a processing error" do
@@ -39,4 +39,25 @@ describe Paperclip::Glue do
39
39
  Object.send :remove_const, "NonActiveRecordModel"
40
40
  end
41
41
  end
42
+
43
+ describe "when included" do
44
+ it "does not mutate I18n.load_path more than once" do
45
+ before_load_path = I18n.load_path
46
+ I18n.load_path = []
47
+
48
+ # expect twice because the load_path is reset after creating the classes
49
+ expect(I18n.config).to receive(:load_path=).and_call_original.twice
50
+
51
+ FirstModel = Class.new
52
+ FirstModel.include Paperclip::Glue
53
+
54
+ SecondModel = Class.new
55
+ SecondModel.include Paperclip::Glue
56
+
57
+ ThirdModel = Class.new
58
+ ThirdModel.include Paperclip::Glue
59
+
60
+ I18n.load_path = before_load_path
61
+ end
62
+ end
42
63
  end
@@ -224,7 +224,7 @@ describe Paperclip::UriAdapter do
224
224
 
225
225
  it "calls open with read_timeout option" do
226
226
  expect(@uri_opener)
227
- .to receive(:open).with(@uri, read_timeout: 120).at_least(1).times
227
+ .to receive(:open).with(@uri, { read_timeout: 120 }).at_least(1).times
228
228
  end
229
229
  end
230
230
  end
@@ -32,12 +32,18 @@ describe Paperclip::MediaTypeSpoofDetector do
32
32
  end
33
33
 
34
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
+
35
41
  begin
36
42
  Paperclip.options[:content_type_mappings] = { pem: "text/plain" }
37
- file = Tempfile.open(["test", ".PEM"])
38
- file.puts "Certificate!"
39
- file.close
40
- adapter = Paperclip.io_adapters.for(File.new(file.path))
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" }
41
47
  assert !Paperclip::MediaTypeSpoofDetector.using(adapter, adapter.original_filename, adapter.content_type).spoofed?
42
48
  ensure
43
49
  Paperclip.options[:content_type_mappings] = {}
@@ -63,7 +63,7 @@ describe Paperclip do
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
- expect(Terrapin::CommandLine).to receive(:new).with("convert", "stuff", logger: Paperclip.logger).and_return(double(run: nil))
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
@@ -395,12 +395,22 @@ describe Paperclip::Storage::S3 do
395
395
  allow(@dummy.avatar).to receive(:s3_object).with(:thumbnail).and_return(object)
396
396
 
397
397
  expect(object).to receive(:upload_file).
398
- with(anything, content_type: "image/png",
399
- acl: :"public-read")
398
+ with(
399
+ anything,
400
+ {
401
+ content_type: "image/png",
402
+ acl: :"public-read",
403
+ },
404
+ )
400
405
  expect(object).to receive(:upload_file).
401
- with(anything, content_type: "image/png",
402
- acl: :"public-read",
403
- cache_control: "max-age=31557600")
406
+ with(
407
+ anything,
408
+ {
409
+ content_type: "image/png",
410
+ acl: :"public-read",
411
+ cache_control: "max-age=31557600",
412
+ },
413
+ )
404
414
  @dummy.save
405
415
  end
406
416
 
@@ -411,6 +421,62 @@ describe Paperclip::Storage::S3 do
411
421
  end
412
422
  end
413
423
 
424
+ context "An attachment that uses S3 for storage with acl disabled" do
425
+ before do
426
+ rebuild_model(
427
+ aws2_add_region.merge(
428
+ storage: :s3,
429
+ styles: { thumb: ["90x90#", :jpg] },
430
+ bucket: "bucket",
431
+ s3_acl_enabled: false,
432
+ s3_credentials: {
433
+ "access_key_id" => "12345",
434
+ "secret_access_key" => "54321"
435
+ }
436
+ )
437
+ )
438
+
439
+ @file = File.new(fixture_file("5k.png"), "rb")
440
+ @dummy = Dummy.new
441
+ @dummy.avatar = @file
442
+ @dummy.save
443
+ end
444
+
445
+ context "reprocess" do
446
+ before do
447
+ @object = double
448
+ allow(@dummy.avatar).to receive(:s3_object).with(:original).and_return(@object)
449
+ allow(@dummy.avatar).to receive(:s3_object).with(:thumb).and_return(@object)
450
+ allow(@object).to receive(:get).and_yield(@file.read)
451
+ allow(@object).to receive(:exists?).and_return(true)
452
+ allow(@object).to receive(:download_file).with(anything)
453
+ end
454
+
455
+ it "uploads original" do
456
+ expect(@object).to receive(:upload_file).with(
457
+ anything,
458
+ { content_type: "image/png" },
459
+ ).and_return(true)
460
+ @dummy.avatar.reprocess!
461
+ expect(@object).to receive(:upload_file).with(
462
+ anything,
463
+ { content_type: "image/png" },
464
+ ).and_return(true)
465
+ @dummy.avatar.reprocess!
466
+ end
467
+
468
+ it "doesn't upload original" do
469
+ expect(@object).to receive(:upload_file).with(
470
+ anything,
471
+ { content_type: "image/png" },
472
+ ).and_return(true)
473
+ @dummy.avatar.reprocess!
474
+ end
475
+ end
476
+
477
+ after { @file.close }
478
+ end
479
+
414
480
  context "An attachment that uses S3 for storage and has styles" do
415
481
  before do
416
482
  rebuild_model(
@@ -444,14 +510,18 @@ describe Paperclip::Storage::S3 do
444
510
  it "uploads original" do
445
511
  expect(@object).to receive(:upload_file).with(
446
512
  anything,
447
- content_type: "image/png",
448
- acl: :"public-read"
513
+ {
514
+ content_type: "image/png",
515
+ acl: :"public-read",
516
+ },
449
517
  ).and_return(true)
450
518
  @dummy.avatar.reprocess!
451
519
  expect(@object).to receive(:upload_file).with(
452
520
  anything,
453
- content_type: "image/png",
454
- acl: :"public-read"
521
+ {
522
+ content_type: "image/png",
523
+ acl: :"public-read",
524
+ },
455
525
  ).and_return(true)
456
526
  @dummy.avatar.reprocess!
457
527
  end
@@ -459,8 +529,10 @@ describe Paperclip::Storage::S3 do
459
529
  it "doesn't upload original" do
460
530
  expect(@object).to receive(:upload_file).with(
461
531
  anything,
462
- content_type: "image/png",
463
- acl: :"public-read"
532
+ {
533
+ content_type: "image/png",
534
+ acl: :"public-read",
535
+ },
464
536
  ).and_return(true)
465
537
  @dummy.avatar.reprocess!
466
538
  end
@@ -669,7 +741,7 @@ describe Paperclip::Storage::S3 do
669
741
  object = double
670
742
  allow(@dummy.avatar).to receive(:s3_object).and_return(object)
671
743
 
672
- expect(object).to receive(:presigned_url).with(:get, expires_in: 3600)
744
+ expect(object).to receive(:presigned_url).with(:get, { expires_in: 3600 })
673
745
  @dummy.avatar.expiring_url
674
746
  end
675
747
  end
@@ -684,8 +756,13 @@ describe Paperclip::Storage::S3 do
684
756
  object = double
685
757
  allow(@dummy.avatar).to receive(:s3_object).and_return(object)
686
758
  expect(object).to receive(:presigned_url).
687
- with(:get, expires_in: 3600,
688
- response_content_disposition: "inline")
759
+ with(
760
+ :get,
761
+ {
762
+ expires_in: 3600,
763
+ response_content_disposition: "inline",
764
+ },
765
+ )
689
766
  @dummy.avatar.expiring_url
690
767
  end
691
768
  end
@@ -707,7 +784,13 @@ describe Paperclip::Storage::S3 do
707
784
  object = double
708
785
  allow(@dummy.avatar).to receive(:s3_object).and_return(object)
709
786
  expect(object).to receive(:presigned_url).
710
- with(:get, expires_in: 3600, response_content_type: "image/png")
787
+ with(
788
+ :get,
789
+ {
790
+ expires_in: 3600,
791
+ response_content_type: "image/png",
792
+ },
793
+ )
711
794
  @dummy.avatar.expiring_url
712
795
  end
713
796
  end
@@ -754,14 +837,14 @@ describe Paperclip::Storage::S3 do
754
837
  it "generates a url for the thumb" do
755
838
  object = double
756
839
  allow(@dummy.avatar).to receive(:s3_object).with(:thumb).and_return(object)
757
- expect(object).to receive(:presigned_url).with(:get, expires_in: 1800)
840
+ expect(object).to receive(:presigned_url).with(:get, { expires_in: 1800 })
758
841
  @dummy.avatar.expiring_url(1800, :thumb)
759
842
  end
760
843
 
761
844
  it "generates a url for the default style" do
762
845
  object = double
763
846
  allow(@dummy.avatar).to receive(:s3_object).with(:original).and_return(object)
764
- expect(object).to receive(:presigned_url).with(:get, expires_in: 1800)
847
+ expect(object).to receive(:presigned_url).with(:get, { expires_in: 1800 })
765
848
  @dummy.avatar.expiring_url(1800)
766
849
  end
767
850
  end
@@ -906,7 +989,7 @@ describe Paperclip::Storage::S3 do
906
989
  object = double
907
990
  allow(@dummy.avatar).to receive(:s3_object).and_return(object)
908
991
  expect(object).to receive(:upload_file).
909
- with(anything, content_type: "image/png", acl: :"public-read")
992
+ with(anything, { content_type: "image/png", acl: :"public-read" })
910
993
  @dummy.save
911
994
  end
912
995
 
@@ -1066,10 +1149,14 @@ describe Paperclip::Storage::S3 do
1066
1149
  allow(@dummy.avatar).to receive(:s3_object).and_return(object)
1067
1150
 
1068
1151
  expect(object).to receive(:upload_file).
1069
- with(anything,
1070
- content_type: "image/png",
1071
- acl: :"public-read",
1072
- cache_control: "max-age=31557600")
1152
+ with(
1153
+ anything,
1154
+ {
1155
+ content_type: "image/png",
1156
+ acl: :"public-read",
1157
+ cache_control: "max-age=31557600",
1158
+ },
1159
+ )
1073
1160
  @dummy.save
1074
1161
  end
1075
1162
 
@@ -1107,10 +1194,14 @@ describe Paperclip::Storage::S3 do
1107
1194
  allow(@dummy.avatar).to receive(:s3_object).and_return(object)
1108
1195
 
1109
1196
  expect(object).to receive(:upload_file).
1110
- with(anything,
1197
+ with(
1198
+ anything,
1199
+ {
1111
1200
  content_type: "image/png",
1112
1201
  acl: :"public-read",
1113
- metadata: { "color" => "red" })
1202
+ metadata: { "color" => "red" },
1203
+ },
1204
+ )
1114
1205
  @dummy.save
1115
1206
  end
1116
1207
 
@@ -1148,10 +1239,14 @@ describe Paperclip::Storage::S3 do
1148
1239
  allow(@dummy.avatar).to receive(:s3_object).and_return(object)
1149
1240
 
1150
1241
  expect(object).to receive(:upload_file).
1151
- with(anything,
1242
+ with(
1243
+ anything,
1244
+ {
1152
1245
  content_type: "image/png",
1153
1246
  acl: :"public-read",
1154
- metadata: { "color" => "red" })
1247
+ metadata: { "color" => "red" },
1248
+ },
1249
+ )
1155
1250
  @dummy.save
1156
1251
  end
1157
1252
 
@@ -1190,10 +1285,14 @@ describe Paperclip::Storage::S3 do
1190
1285
  allow(@dummy.avatar).to receive(:s3_object).and_return(object)
1191
1286
 
1192
1287
  expect(object).to receive(:upload_file).
1193
- with(anything,
1288
+ with(
1289
+ anything,
1290
+ {
1194
1291
  content_type: "image/png",
1195
1292
  acl: :"public-read",
1196
- storage_class: "reduced_redundancy")
1293
+ storage_class: "reduced_redundancy",
1294
+ },
1295
+ )
1197
1296
  @dummy.save
1198
1297
  end
1199
1298
 
@@ -1286,9 +1385,14 @@ describe Paperclip::Storage::S3 do
1286
1385
  allow(@dummy.avatar).to receive(:s3_object).with(style).and_return(object)
1287
1386
 
1288
1387
  expect(object).to receive(:upload_file).
1289
- with(anything, content_type: "image/png",
1290
- acl: :"public-read",
1291
- storage_class: :reduced_redundancy)
1388
+ with(
1389
+ anything,
1390
+ {
1391
+ content_type: "image/png",
1392
+ acl: :"public-read",
1393
+ storage_class: :reduced_redundancy,
1394
+ },
1395
+ )
1292
1396
  end
1293
1397
  @dummy.save
1294
1398
  end
@@ -1331,7 +1435,7 @@ describe Paperclip::Storage::S3 do
1331
1435
  allow(@dummy.avatar).to receive(:s3_object).and_return(object)
1332
1436
 
1333
1437
  expect(object).to receive(:upload_file).
1334
- with(anything, content_type: "image/png", acl: :"public-read")
1438
+ with(anything, { content_type: "image/png", acl: :"public-read" })
1335
1439
  @dummy.save
1336
1440
  end
1337
1441
 
@@ -1370,9 +1474,14 @@ describe Paperclip::Storage::S3 do
1370
1474
  allow(@dummy.avatar).to receive(:s3_object).and_return(object)
1371
1475
 
1372
1476
  expect(object).to receive(:upload_file).
1373
- with(anything, content_type: "image/png",
1374
- acl: :"public-read",
1375
- server_side_encryption: "AES256")
1477
+ with(
1478
+ anything,
1479
+ {
1480
+ content_type: "image/png",
1481
+ acl: :"public-read",
1482
+ server_side_encryption: "AES256",
1483
+ },
1484
+ )
1376
1485
  @dummy.save
1377
1486
  end
1378
1487
 
@@ -1410,10 +1519,14 @@ describe Paperclip::Storage::S3 do
1410
1519
  allow(@dummy.avatar).to receive(:s3_object).and_return(object)
1411
1520
 
1412
1521
  expect(object).to receive(:upload_file).
1413
- with(anything,
1414
- content_type: "image/png",
1415
- acl: :"public-read",
1416
- storage_class: :reduced_redundancy)
1522
+ with(
1523
+ anything,
1524
+ {
1525
+ content_type: "image/png",
1526
+ acl: :"public-read",
1527
+ storage_class: :reduced_redundancy,
1528
+ },
1529
+ )
1417
1530
  @dummy.save
1418
1531
  end
1419
1532
 
@@ -1557,7 +1670,7 @@ describe Paperclip::Storage::S3 do
1557
1670
  allow(@dummy.avatar).to receive(:s3_object).and_return(object)
1558
1671
 
1559
1672
  expect(object).to receive(:upload_file).
1560
- with(anything, content_type: "image/png", acl: :"public-read")
1673
+ with(anything, { content_type: "image/png", acl: :"public-read" })
1561
1674
  @dummy.save
1562
1675
  end
1563
1676
 
@@ -1595,7 +1708,7 @@ describe Paperclip::Storage::S3 do
1595
1708
  allow(@dummy.avatar).to receive(:s3_object).and_return(object)
1596
1709
 
1597
1710
  expect(object).to receive(:upload_file).
1598
- with(anything, content_type: "image/png", acl: :private)
1711
+ with(anything, { content_type: "image/png", acl: :private })
1599
1712
  @dummy.save
1600
1713
  end
1601
1714
 
@@ -1641,8 +1754,10 @@ describe Paperclip::Storage::S3 do
1641
1754
 
1642
1755
  expect(object).to receive(:upload_file).
1643
1756
  with(anything,
1644
- content_type: "image/png",
1645
- acl: style == :thumb ? :public_read : :private)
1757
+ {
1758
+ content_type: "image/png",
1759
+ acl: style == :thumb ? :public_read : :private
1760
+ })
1646
1761
  end
1647
1762
  @dummy.save
1648
1763
  end
@@ -1711,10 +1826,14 @@ describe Paperclip::Storage::S3 do
1711
1826
  allow(@dummy.avatar).to receive(:s3_object).with(style).and_return(object)
1712
1827
 
1713
1828
  expect(object).to receive(:upload_file).
1714
- with(anything,
1715
- content_type: "image/png",
1716
- acl: :"public-read",
1717
- content_disposition: 'attachment; filename="Custom Avatar Name.png"')
1829
+ with(
1830
+ anything,
1831
+ {
1832
+ content_type: "image/png",
1833
+ acl: :"public-read",
1834
+ content_disposition: 'attachment; filename="Custom Avatar Name.png"',
1835
+ },
1836
+ )
1718
1837
  end
1719
1838
  @dummy.save
1720
1839
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kt-paperclip
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.1.1
4
+ version: 7.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Surendra Singhi
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-09 00:00:00.000000000 Z
11
+ date: 2023-09-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -428,6 +428,7 @@ files:
428
428
  - lib/paperclip/io_adapters/uploaded_file_adapter.rb
429
429
  - lib/paperclip/io_adapters/uri_adapter.rb
430
430
  - lib/paperclip/locales/en.yml
431
+ - lib/paperclip/locales/gd.yml
431
432
  - lib/paperclip/logger.rb
432
433
  - lib/paperclip/matchers.rb
433
434
  - lib/paperclip/matchers/have_attached_file_matcher.rb
@@ -587,8 +588,114 @@ required_rubygems_version: !ruby/object:Gem::Requirement
587
588
  version: '0'
588
589
  requirements:
589
590
  - ImageMagick
590
- rubygems_version: 3.0.1
591
- signing_key:
591
+ rubygems_version: 3.1.6
592
+ signing_key:
592
593
  specification_version: 4
593
594
  summary: File attachments as attributes for ActiveRecord
594
- test_files: []
595
+ test_files:
596
+ - features/basic_integration.feature
597
+ - features/migration.feature
598
+ - features/rake_tasks.feature
599
+ - features/step_definitions/attachment_steps.rb
600
+ - features/step_definitions/html_steps.rb
601
+ - features/step_definitions/rails_steps.rb
602
+ - features/step_definitions/s3_steps.rb
603
+ - features/step_definitions/web_steps.rb
604
+ - features/support/env.rb
605
+ - features/support/fakeweb.rb
606
+ - features/support/file_helpers.rb
607
+ - features/support/fixtures/boot_config.txt
608
+ - features/support/fixtures/gemfile.txt
609
+ - features/support/fixtures/preinitializer.txt
610
+ - features/support/paths.rb
611
+ - features/support/rails.rb
612
+ - features/support/selectors.rb
613
+ - spec/database.yml
614
+ - spec/paperclip/attachment_definitions_spec.rb
615
+ - spec/paperclip/attachment_processing_spec.rb
616
+ - spec/paperclip/attachment_registry_spec.rb
617
+ - spec/paperclip/attachment_spec.rb
618
+ - spec/paperclip/content_type_detector_spec.rb
619
+ - spec/paperclip/file_command_content_type_detector_spec.rb
620
+ - spec/paperclip/filename_cleaner_spec.rb
621
+ - spec/paperclip/geometry_detector_spec.rb
622
+ - spec/paperclip/geometry_parser_spec.rb
623
+ - spec/paperclip/geometry_spec.rb
624
+ - spec/paperclip/glue_spec.rb
625
+ - spec/paperclip/has_attached_file_spec.rb
626
+ - spec/paperclip/integration_spec.rb
627
+ - spec/paperclip/interpolations_spec.rb
628
+ - spec/paperclip/io_adapters/abstract_adapter_spec.rb
629
+ - spec/paperclip/io_adapters/attachment_adapter_spec.rb
630
+ - spec/paperclip/io_adapters/data_uri_adapter_spec.rb
631
+ - spec/paperclip/io_adapters/empty_string_adapter_spec.rb
632
+ - spec/paperclip/io_adapters/file_adapter_spec.rb
633
+ - spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb
634
+ - spec/paperclip/io_adapters/identity_adapter_spec.rb
635
+ - spec/paperclip/io_adapters/nil_adapter_spec.rb
636
+ - spec/paperclip/io_adapters/registry_spec.rb
637
+ - spec/paperclip/io_adapters/stringio_adapter_spec.rb
638
+ - spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb
639
+ - spec/paperclip/io_adapters/uri_adapter_spec.rb
640
+ - spec/paperclip/matchers/have_attached_file_matcher_spec.rb
641
+ - spec/paperclip/matchers/validate_attachment_content_type_matcher_spec.rb
642
+ - spec/paperclip/matchers/validate_attachment_presence_matcher_spec.rb
643
+ - spec/paperclip/matchers/validate_attachment_size_matcher_spec.rb
644
+ - spec/paperclip/media_type_spoof_detector_spec.rb
645
+ - spec/paperclip/meta_class_spec.rb
646
+ - spec/paperclip/paperclip_missing_attachment_styles_spec.rb
647
+ - spec/paperclip/paperclip_spec.rb
648
+ - spec/paperclip/plural_cache_spec.rb
649
+ - spec/paperclip/processor_helpers_spec.rb
650
+ - spec/paperclip/processor_spec.rb
651
+ - spec/paperclip/rails_environment_spec.rb
652
+ - spec/paperclip/rake_spec.rb
653
+ - spec/paperclip/schema_spec.rb
654
+ - spec/paperclip/storage/filesystem_spec.rb
655
+ - spec/paperclip/storage/fog_spec.rb
656
+ - spec/paperclip/storage/s3_live_spec.rb
657
+ - spec/paperclip/storage/s3_spec.rb
658
+ - spec/paperclip/style_spec.rb
659
+ - spec/paperclip/tempfile_factory_spec.rb
660
+ - spec/paperclip/tempfile_spec.rb
661
+ - spec/paperclip/thumbnail_spec.rb
662
+ - spec/paperclip/url_generator_spec.rb
663
+ - spec/paperclip/validators/attachment_content_type_validator_spec.rb
664
+ - spec/paperclip/validators/attachment_file_name_validator_spec.rb
665
+ - spec/paperclip/validators/attachment_presence_validator_spec.rb
666
+ - spec/paperclip/validators/attachment_size_validator_spec.rb
667
+ - spec/paperclip/validators/media_type_spoof_detection_validator_spec.rb
668
+ - spec/paperclip/validators_spec.rb
669
+ - spec/spec_helper.rb
670
+ - spec/support/assertions.rb
671
+ - spec/support/fake_model.rb
672
+ - spec/support/fake_rails.rb
673
+ - spec/support/fixtures/12k.png
674
+ - spec/support/fixtures/50x50.png
675
+ - spec/support/fixtures/5k.png
676
+ - spec/support/fixtures/animated
677
+ - spec/support/fixtures/animated.gif
678
+ - spec/support/fixtures/animated.unknown
679
+ - spec/support/fixtures/aws_s3.yml
680
+ - spec/support/fixtures/bad.png
681
+ - spec/support/fixtures/empty.html
682
+ - spec/support/fixtures/empty.xlsx
683
+ - spec/support/fixtures/fog.yml
684
+ - spec/support/fixtures/rotated.jpg
685
+ - spec/support/fixtures/s3.yml
686
+ - spec/support/fixtures/sample.xlsm
687
+ - spec/support/fixtures/spaced file.jpg
688
+ - spec/support/fixtures/spaced file.png
689
+ - spec/support/fixtures/text.txt
690
+ - spec/support/fixtures/twopage.pdf
691
+ - spec/support/fixtures/uppercase.PNG
692
+ - spec/support/matchers/accept.rb
693
+ - spec/support/matchers/exist.rb
694
+ - spec/support/matchers/have_column.rb
695
+ - spec/support/mock_attachment.rb
696
+ - spec/support/mock_interpolator.rb
697
+ - spec/support/mock_url_generator_builder.rb
698
+ - spec/support/model_reconstruction.rb
699
+ - spec/support/reporting.rb
700
+ - spec/support/test_data.rb
701
+ - spec/support/version_helper.rb