diff --git a/.travis.yml b/.travis.yml index 182e74b90..42a28bc05 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,6 @@ language: ruby sudo: false rvm: - - 2.1 - - 2.2 - 2.3 - 2.4 - 2.5 diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c0f4dcb1..711757de5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ ## HEAD +* Drop support for MRI 2.1 and 2.2 (@janko-m) + * Fix `backgrounding` not working when default storage was changed with `Attachment.new` (@janko-m) * Don't clear existing metadata definitions when loading `add_metadata` plugin (@janko-m) diff --git a/lib/shrine.rb b/lib/shrine.rb index f8ae22033..97c64892f 100644 --- a/lib/shrine.rb +++ b/lib/shrine.rb @@ -33,7 +33,7 @@ def initialize(io, missing_methods) size: [], close: [], } - deprecate_constant(:IO_METHODS) if RUBY_VERSION > "2.3" + deprecate_constant(:IO_METHODS) @opts = {} @storages = {} diff --git a/lib/shrine/plugins/_urlsafe_serialization.rb b/lib/shrine/plugins/_urlsafe_serialization.rb index 3b2f9c6c8..5b1f8d1b1 100644 --- a/lib/shrine/plugins/_urlsafe_serialization.rb +++ b/lib/shrine/plugins/_urlsafe_serialization.rb @@ -121,14 +121,8 @@ def json_encode(data) JSON.generate(data) end - if RUBY_VERSION >= "2.3" - def base64_encode(data) - Base64.urlsafe_encode64(data, padding: false) - end - else - def base64_encode(data) - Base64.urlsafe_encode64(data) - end + def base64_encode(data) + Base64.urlsafe_encode64(data, padding: false) end def base64_decode(data) diff --git a/lib/shrine/plugins/download_endpoint.rb b/lib/shrine/plugins/download_endpoint.rb index bc6a4b01d..e47d80db1 100644 --- a/lib/shrine/plugins/download_endpoint.rb +++ b/lib/shrine/plugins/download_endpoint.rb @@ -132,7 +132,7 @@ def assign_download_endpoint(klass) @download_endpoint = endpoint_class const_set(:DownloadEndpoint, endpoint_class) - deprecate_constant(:DownloadEndpoint) if RUBY_VERSION > "2.3" + deprecate_constant(:DownloadEndpoint) end end diff --git a/lib/shrine/plugins/presign_endpoint.rb b/lib/shrine/plugins/presign_endpoint.rb index 5054f83d3..e1a3dc77d 100644 --- a/lib/shrine/plugins/presign_endpoint.rb +++ b/lib/shrine/plugins/presign_endpoint.rb @@ -138,14 +138,15 @@ module ClassMethods # Additional options can be given to override the options given on # plugin initialization. def presign_endpoint(storage_key, **options) - App.new({ + App.new( shrine_class: self, storage_key: storage_key, presign_location: opts[:presign_endpoint_presign_location], presign_options: opts[:presign_endpoint_presign_options], presign: opts[:presign_endpoint_presign], rack_response: opts[:presign_endpoint_rack_response], - }.merge(options)) + **options + ) end end diff --git a/lib/shrine/plugins/rack_response.rb b/lib/shrine/plugins/rack_response.rb index 3653351a1..7a0cebb82 100644 --- a/lib/shrine/plugins/rack_response.rb +++ b/lib/shrine/plugins/rack_response.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require "rack" -require "content_disposition" if RUBY_VERSION >= "2.3.0" +require "content_disposition" class Shrine module Plugins @@ -156,14 +156,8 @@ def parse_content_range(range_header) ranges.first if ranges && ranges.one? end - if RUBY_VERSION >= "2.3.0" - def content_disposition(disposition:, filename:) - ContentDisposition.format(disposition: disposition, filename: filename) - end - else - def content_disposition(disposition:, filename:) - "#{disposition}; filename=\"#{filename}\"" - end + def content_disposition(disposition:, filename:) + ContentDisposition.format(disposition: disposition, filename: filename) end # Read size from metadata, otherwise retrieve the size from the storage. diff --git a/lib/shrine/plugins/upload_endpoint.rb b/lib/shrine/plugins/upload_endpoint.rb index d05324639..0cb853c8a 100644 --- a/lib/shrine/plugins/upload_endpoint.rb +++ b/lib/shrine/plugins/upload_endpoint.rb @@ -135,14 +135,15 @@ module ClassMethods # Additional options can be given to override the options given on # plugin initialization. def upload_endpoint(storage_key, **options) - App.new({ + App.new( shrine_class: self, storage_key: storage_key, max_size: opts[:upload_endpoint_max_size], upload_context: opts[:upload_endpoint_upload_context], upload: opts[:upload_endpoint_upload], rack_response: opts[:upload_endpoint_rack_response], - }.merge(options)) + **options + ) end end diff --git a/lib/shrine/storage/s3.rb b/lib/shrine/storage/s3.rb index 23bcfb9fb..8f5941e53 100644 --- a/lib/shrine/storage/s3.rb +++ b/lib/shrine/storage/s3.rb @@ -17,7 +17,7 @@ end require "down/chunked_io" -require "content_disposition" if RUBY_VERSION >= "2.3.0" +require "content_disposition" require "uri" require "cgi" @@ -353,7 +353,7 @@ def upload(io, id, shrine_metadata: {}, **upload_options) options = {} options[:content_type] = content_type if content_type - options[:content_disposition] = content_disposition(:inline, filename) if filename + options[:content_disposition] = ContentDisposition.inline(filename) if filename options[:acl] = "public-read" if public options.merge!(@upload_options) @@ -606,16 +606,6 @@ def delete_objects(objects) end end - if RUBY_VERSION >= "2.3.0" - def content_disposition(disposition, filename) - ContentDisposition.format(disposition: disposition, filename: filename) - end - else - def content_disposition(disposition, filename) - "inline; filename=\"#{filename}\"" - end - end - # Upload requests will fail if filename has non-ASCII characters, because # of how S3 generates signatures, so we URI-encode them. Most browsers # should automatically URI-decode filenames when downloading. diff --git a/lib/shrine/uploaded_file.rb b/lib/shrine/uploaded_file.rb index cb4cd8018..eae9c6bd9 100644 --- a/lib/shrine/uploaded_file.rb +++ b/lib/shrine/uploaded_file.rb @@ -92,7 +92,7 @@ def mime_type # # uploaded_file.open { |io| io.read } # the IO is automatically closed def open(*args) - @io.close if @io && !(@io.respond_to?(:closed?) && @io.closed?) + @io.close if @io @io = storage.open(id, *args) return @io unless block_given? diff --git a/shrine.gemspec b/shrine.gemspec index 9eac8a7fd..8a8c37c1b 100644 --- a/shrine.gemspec +++ b/shrine.gemspec @@ -4,7 +4,7 @@ Gem::Specification.new do |gem| gem.name = "shrine" gem.version = Shrine.version - gem.required_ruby_version = ">= 2.1" + gem.required_ruby_version = ">= 2.3" gem.summary = "Toolkit for file attachments in Ruby applications" gem.description = <<-END @@ -27,7 +27,7 @@ direct uploads for fully asynchronous user experience. gem.require_path = "lib" gem.add_dependency "down", "~> 4.1" - gem.add_dependency "content_disposition", "~> 1.0" if RUBY_VERSION >= "2.3.0" + gem.add_dependency "content_disposition", "~> 1.0" gem.add_development_dependency "rake", ">= 11.1" gem.add_development_dependency "minitest", "~> 5.8" @@ -37,11 +37,12 @@ direct uploads for fully asynchronous user experience. gem.add_development_dependency "shrine-memory", ">= 0.2.2" gem.add_development_dependency "roda" - gem.add_development_dependency "rack", (RUBY_VERSION >= "2.2.2" ? "~> 2.0" : "~> 1.6") + gem.add_development_dependency "rack", "~> 2.0" gem.add_development_dependency "mimemagic", ">= 0.3.2" - gem.add_development_dependency "marcel" if RUBY_VERSION >= "2.2.0" + gem.add_development_dependency "marcel" gem.add_development_dependency "mime-types" gem.add_development_dependency "mini_mime", "~> 1.0" + gem.add_development_dependency "ruby-filemagic", "~> 0.7" unless RUBY_ENGINE == "jruby" || ENV["CI"] gem.add_development_dependency "fastimage" gem.add_development_dependency "mini_magick", "~> 4.0" unless ENV["CI"] gem.add_development_dependency "ruby-vips", "~> 2.0" unless ENV["CI"] @@ -49,20 +50,10 @@ direct uploads for fully asynchronous user experience. gem.add_development_dependency "aws-sdk-core", "~> 3.23" gem.add_development_dependency "http-form_data", "~> 2.0" - unless RUBY_ENGINE == "jruby" || ENV["CI"] - gem.add_development_dependency "ruby-filemagic", "~> 0.7" - end - gem.add_development_dependency "sequel" - - if RUBY_VERSION >= "2.2.2" - gem.add_development_dependency "activerecord", "~> 5.0" - else - gem.add_development_dependency "activerecord", "~> 4.2" - end - + gem.add_development_dependency "activerecord", "~> 5.2.0" if RUBY_ENGINE == "jruby" - gem.add_development_dependency "activerecord-jdbcsqlite3-adapter", "51" + gem.add_development_dependency "activerecord-jdbcsqlite3-adapter", "~> 52.0" else gem.add_development_dependency "sqlite3" end diff --git a/test/file_system_test.rb b/test/file_system_test.rb index 5bb07d01f..08f509d85 100644 --- a/test/file_system_test.rb +++ b/test/file_system_test.rb @@ -124,7 +124,7 @@ def root_symlink describe "#movable?" do it "returns true for files and UploadedFiles from FileSystem" do - file = Tempfile.new("") + file = Tempfile.new file_system_uploaded_file = @shrine.new(:file_system).upload(fakeio) memory_uploaded_file = @shrine.new(:memory).upload(fakeio) assert @storage.movable?(file, nil) @@ -135,7 +135,7 @@ def root_symlink describe "#move" do it "moves files and UploadedFiles" do - file = Tempfile.new("") + file = Tempfile.new uploaded_file = @shrine.new(:file_system).upload(fakeio) @storage.move(file, "foo") @@ -148,7 +148,7 @@ def root_symlink end it "creates subdirectories" do - file = Tempfile.new("") + file = Tempfile.new uploaded_file = @shrine.new(:file_system).upload(fakeio) @storage.move(file, "a/a/a.jpg") @@ -166,18 +166,18 @@ def root_symlink it "sets file permissions" do @storage = file_system(root, permissions: 0600) - @storage.move(Tempfile.new(""), "bar.jpg") + @storage.move(Tempfile.new, "bar.jpg") assert_permissions 0600, @storage.open("bar.jpg").path end it "handles file permissions being nil" do @storage = file_system(root, permissions: nil) - @storage.move(Tempfile.new(""), "bar.jpg") + @storage.move(Tempfile.new, "bar.jpg") end it "sets directory permissions on intermediary directories" do @storage = file_system(root, directory_permissions: 0777) - @storage.move(Tempfile.new(""), "a/b/c/file.jpg") + @storage.move(Tempfile.new, "a/b/c/file.jpg") assert_permissions 0777, "#{root}/a" assert_permissions 0777, "#{root}/a/b" assert_permissions 0777, "#{root}/a/b/c" @@ -185,7 +185,7 @@ def root_symlink it "handles directory permissions being nil" do @storage = file_system(root, directory_permissions: nil) - @storage.move(Tempfile.new(""), "a/b/c/file.jpg") + @storage.move(Tempfile.new, "a/b/c/file.jpg") end end @@ -336,7 +336,7 @@ def root_symlink end deprecated "#download deletes the Tempfile if an error occurs while retrieving file contents" do - tempfile = Tempfile.new("") + tempfile = Tempfile.new Tempfile.stubs(:new).returns(tempfile) assert_raises(Errno::ENOENT) { @storage.download("foo") } assert tempfile.closed? diff --git a/test/plugin/delete_raw_test.rb b/test/plugin/delete_raw_test.rb index b4b4942a3..8cb0f6188 100644 --- a/test/plugin/delete_raw_test.rb +++ b/test/plugin/delete_raw_test.rb @@ -7,24 +7,24 @@ end it "deletes files after upload" do - @uploader.upload(tempfile = Tempfile.new("")) + @uploader.upload(tempfile = Tempfile.new) refute File.exist?(tempfile.path) end it "deletes tempfiles after upload" do - @uploader.upload(file = File.open(Tempfile.new("").path)) + @uploader.upload(file = File.open(Tempfile.new.path)) refute File.exist?(file.path) end it "deletes IOs that respond to #path after upload" do io = FakeIO.new("file") - def io.path; (@tempfile ||= Tempfile.new("")).path; end + def io.path; (@tempfile ||= Tempfile.new).path; end @uploader.upload(io) refute File.exist?(io.path) end it "doesn't raise an error if file is already deleted" do - tempfile = Tempfile.new("") + tempfile = Tempfile.new File.delete(tempfile.path) @uploader.upload(tempfile) end @@ -41,9 +41,9 @@ def io.path; (@tempfile ||= Tempfile.new("")).path; end it "accepts specifying storages" do @uploader.class.plugin :delete_raw, storages: [:store] - @uploader.class.new(:cache).upload(tempfile = Tempfile.new("")) + @uploader.class.new(:cache).upload(tempfile = Tempfile.new) assert File.exist?(tempfile.path) - @uploader.class.new(:store).upload(tempfile = Tempfile.new("")) + @uploader.class.new(:store).upload(tempfile = Tempfile.new) refute File.exist?(tempfile.path) end end diff --git a/test/plugin/determine_mime_type_test.rb b/test/plugin/determine_mime_type_test.rb index ab0f099ec..0a9f0df25 100644 --- a/test/plugin/determine_mime_type_test.rb +++ b/test/plugin/determine_mime_type_test.rb @@ -136,7 +136,7 @@ it "returns nil for empty IOs" do assert_nil @shrine.determine_mime_type(fakeio("")) end - end if RUBY_VERSION >= "2.2.0" + end describe ":mime_types analyzer" do before do diff --git a/test/plugin/download_endpoint_test.rb b/test/plugin/download_endpoint_test.rb index 9df985a05..86796cffd 100644 --- a/test/plugin/download_endpoint_test.rb +++ b/test/plugin/download_endpoint_test.rb @@ -7,16 +7,6 @@ def app Rack::TestApp.wrap(Rack::Lint.new(@uploader.class.download_endpoint)) end - if RUBY_VERSION >= "2.3.0" - def content_disposition(disposition, filename) - ContentDisposition.format(disposition: disposition, filename: filename) - end - else - def content_disposition(disposition, filename) - "#{disposition}; filename=\"#{filename}\"" - end - end - before do @uploader = uploader { plugin :download_endpoint } @shrine = @uploader.class @@ -31,14 +21,14 @@ def content_disposition(disposition, filename) assert_equal @uploaded_file.read, response.body_binary assert_equal @uploaded_file.size.to_s, response.headers["Content-Length"] assert_equal @uploaded_file.mime_type, response.headers["Content-Type"] - assert_equal content_disposition(:inline, @uploaded_file.original_filename), response.headers["Content-Disposition"] + assert_equal ContentDisposition.inline(@uploaded_file.original_filename), response.headers["Content-Disposition"] end it "applies :disposition to response" do @uploader = uploader { plugin :download_endpoint, disposition: "attachment" } @uploaded_file = @uploader.upload(fakeio) response = app.get(@uploaded_file.download_url) - assert_equal content_disposition(:attachment, @uploaded_file.id), response.headers["Content-Disposition"] + assert_equal ContentDisposition.attachment(@uploaded_file.id), response.headers["Content-Disposition"] end it "returns Cache-Control" do diff --git a/test/plugin/rack_file_test.rb b/test/plugin/rack_file_test.rb index bde8b56c8..26da1a91a 100644 --- a/test/plugin/rack_file_test.rb +++ b/test/plugin/rack_file_test.rb @@ -8,7 +8,7 @@ @shrine = @attacher.shrine_class @rack_hash = { name: "file", - tempfile: Tempfile.new(""), + tempfile: Tempfile.new, filename: "image.jpg", type: "image/jpeg", head: "...", diff --git a/test/plugin/rack_response_test.rb b/test/plugin/rack_response_test.rb index 57dd4430d..5fd5be676 100644 --- a/test/plugin/rack_response_test.rb +++ b/test/plugin/rack_response_test.rb @@ -9,16 +9,6 @@ @shrine = @uploader.class end - if RUBY_VERSION >= "2.3.0" - def content_disposition(disposition, filename) - ContentDisposition.format(disposition: disposition, filename: filename) - end - else - def content_disposition(disposition, filename) - "#{disposition}; filename=\"#{filename}\"" - end - end - it "returns 200 status" do uploaded_file = @uploader.upload(fakeio("content")) response = uploaded_file.to_rack_response @@ -72,25 +62,25 @@ def content_disposition(disposition, filename) it "returns Content-Disposition filename from metadata" do uploaded_file = @uploader.upload(fakeio(filename: "plain.txt")) response = uploaded_file.to_rack_response - assert_equal content_disposition(:inline, "plain.txt"), response[1]["Content-Disposition"] + assert_equal ContentDisposition.inline("plain.txt"), response[1]["Content-Disposition"] end it "returns Content-Disposition filename from :filename" do uploaded_file = @uploader.upload(fakeio(filename: "plain.txt")) response = uploaded_file.to_rack_response(filename: "custom.txt") - assert_equal content_disposition(:inline, "custom.txt"), response[1]["Content-Disposition"] + assert_equal ContentDisposition.inline("custom.txt"), response[1]["Content-Disposition"] end it "returns Content-Disposition filename with id if metadata is missing" do uploaded_file = @uploader.upload(fakeio, location: "foo/bar/baz") response = uploaded_file.to_rack_response - assert_equal content_disposition(:inline, "baz"), response[1]["Content-Disposition"] + assert_equal ContentDisposition.inline("baz"), response[1]["Content-Disposition"] end it "returns Content-Disposition disposition from :disposition" do uploaded_file = @uploader.upload(fakeio) response = uploaded_file.to_rack_response(disposition: "attachment") - assert_equal content_disposition(:attachment, uploaded_file.id), response[1]["Content-Disposition"] + assert_equal ContentDisposition.attachment(uploaded_file.id), response[1]["Content-Disposition"] end it "returns body which yields contents of the file" do diff --git a/test/s3_test.rb b/test/s3_test.rb index 7acbfa9c1..0fa72ef0d 100644 --- a/test/s3_test.rb +++ b/test/s3_test.rb @@ -11,10 +11,7 @@ describe Shrine::Storage::S3 do def s3(**options) - Shrine::Storage::S3.new({ - bucket: "my-bucket", - stub_responses: true, - }.merge(options)) + Shrine::Storage::S3.new(bucket: "my-bucket", stub_responses: true, **options) end before do @@ -24,16 +21,6 @@ def s3(**options) @uploader = @shrine.new(:s3) end - if RUBY_VERSION >= "2.3.0" - def content_disposition(disposition, filename) - ContentDisposition.format(disposition: disposition, filename: filename) - end - else - def content_disposition(disposition, filename) - "#{disposition}; filename=\"#{filename}\"" - end - end - describe "#initialize" do it "raises an appropriate error when :bucket is nil" do error = assert_raises(ArgumentError) { s3(bucket: nil) } @@ -365,7 +352,7 @@ def content_disposition(disposition, filename) it "forwards filename metadata" do @s3.upload(fakeio, "foo", shrine_metadata: { "filename" => "file.txt" }) - assert_equal content_disposition(:inline, "file.txt"), @s3.client.api_requests[0][:params][:content_disposition] + assert_equal ContentDisposition.inline("file.txt"), @s3.client.api_requests[0][:params][:content_disposition] end deprecated "accepts :content_disposition with non-ASCII characters, quotes, and spaces" do @@ -702,7 +689,7 @@ def content_disposition(disposition, filename) deprecated "deletes the Tempfile if an error occurs while retrieving file contents" do @s3.client.stub_responses(:get_object, "NetworkingError") - tempfile = Tempfile.new("") + tempfile = Tempfile.new Tempfile.stubs(:new).returns(tempfile) assert_raises(Aws::S3::Errors::NetworkingError) { @s3.download("foo") } assert tempfile.closed? diff --git a/test/shrine_test.rb b/test/shrine_test.rb index 876e9acb6..1d77d85db 100644 --- a/test/shrine_test.rb +++ b/test/shrine_test.rb @@ -126,7 +126,7 @@ end it "yields Tempfile objects unchanged" do - tempfile = Tempfile.new("") + tempfile = Tempfile.new @shrine.with_file(tempfile) do |object| assert_equal tempfile, object end