From 43ee6740c30a5c8e692944e505a8208d4d984fe9 Mon Sep 17 00:00:00 2001 From: Anton Orel Date: Thu, 12 Nov 2020 16:14:47 -0500 Subject: [PATCH] Performance improvement, fixes twice #url method call --- lib/carrierwave/uploader/url.rb | 9 ++++++--- spec/uploader/url_spec.rb | 24 +++++++++++++----------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/lib/carrierwave/uploader/url.rb b/lib/carrierwave/uploader/url.rb index 2213f57a0..712aacb3b 100644 --- a/lib/carrierwave/uploader/url.rb +++ b/lib/carrierwave/uploader/url.rb @@ -15,9 +15,12 @@ module Url # [String] the location where this file is accessible via a url # def url(options = {}) - if file.respond_to?(:url) && !(tmp_url = file.url).blank? - file.method(:url).arity.zero? ? tmp_url : file.url(options) - elsif file.respond_to?(:path) + if file.respond_to?(:url) + tmp_url = file.method(:url).arity.zero? ? file.url : file.url(options) + return tmp_url if tmp_url.present? + end + + if file.respond_to?(:path) path = encode_path(file.path.sub(File.expand_path(root), '')) if host = asset_host diff --git a/spec/uploader/url_spec.rb b/spec/uploader/url_spec.rb index 09af135ee..9ea700bdf 100644 --- a/spec/uploader/url_spec.rb +++ b/spec/uploader/url_spec.rb @@ -60,21 +60,23 @@ end end - context "when File#url method doesn't get params" do + context "File#url" do + let(:file_class) { FileX = Class.new } + let(:file) { file_class.new } + before do - module StorageX - class File - def url - true - end - end - end + allow(uploader).to receive(:file).and_return(file) + end - allow(uploader).to receive(:file).and_return(StorageX::File.new) + it "does not accept arguments" do + file.define_singleton_method(:url) { true } + uploader.url end - it "raises ArgumentError" do - expect { uploader.url }.not_to raise_error + it "does accept arguments" do + file.define_singleton_method(:url) { |x = true| x } + expect(file).to receive(:url).once.and_call_original + uploader.url end end