Filename generator extraction refactor #11337
parent
09d7ce60ca
commit
684d488069
@ -0,0 +1,32 @@
|
||||
module Carto
|
||||
module FilenameGenerator
|
||||
def filename_from_url(url, supported_extensions)
|
||||
filename = CGI.unescape(File.basename(URI(url).path))
|
||||
|
||||
extension = File.extname(filename)
|
||||
if extension.present? && supported_extensions.include?(extension)
|
||||
filename
|
||||
else
|
||||
# For non-conventional URLs (i.e: filename in params)
|
||||
regex_match = url_filename_regex(supported_extensions).match(url).to_s
|
||||
|
||||
regex_match if regex_match.present?
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def url_filename_regex(supported_extensions)
|
||||
se_match_regex = Regexp.union(supported_extensions_match(supported_extensions))
|
||||
Regexp.new("[[:word:]-]+#{se_match_regex}+", Regexp::IGNORECASE)
|
||||
end
|
||||
|
||||
def supported_extensions_match(supported_extensions)
|
||||
supported_extensions.map { |ext|
|
||||
ext = ext.gsub('.', '\\.')
|
||||
[/#{ext}$/i, /#{ext}(?=\.)/i, /#{ext}(?=\?)/i, /#{ext}(?=&)/i]
|
||||
}.flatten
|
||||
end
|
||||
|
||||
end
|
||||
end
|
@ -0,0 +1,53 @@
|
||||
require 'active_support'
|
||||
require 'active_support/core_ext/object/blank'
|
||||
require_relative '../../../lib/carto/filename_generator'
|
||||
|
||||
describe Carto::FilenameGenerator do
|
||||
class TestFilenameGenerator
|
||||
include Carto::FilenameGenerator
|
||||
end
|
||||
|
||||
describe '#filename_from_url' do
|
||||
let(:generator) { TestFilenameGenerator.new }
|
||||
let(:supported_extensions) { %w(.csv .carto .zip) }
|
||||
|
||||
it 'returns the full url for just filenames' do
|
||||
['a_name.csv', 'a_name.carto'].each do |filename|
|
||||
generator.filename_from_url(filename, supported_extensions).should eq filename
|
||||
end
|
||||
end
|
||||
|
||||
it 'returns nil for unsupported extensions' do
|
||||
['a_name.wadus', 'a_name'].each do |filename|
|
||||
generator.filename_from_url(filename, supported_extensions).should be_nil
|
||||
end
|
||||
end
|
||||
|
||||
it 'returns the filename for normal urls' do
|
||||
[%w(http://carto.com/name.csv name.csv), %w(http://carto.com/sub/file.carto file.carto)].each do |url, filename|
|
||||
generator.filename_from_url(url, supported_extensions).should eq filename
|
||||
end
|
||||
end
|
||||
|
||||
it 'returns the filename for filenames with dots and other characters' do
|
||||
name1 = 'name.something (one - two : three).carto'
|
||||
|
||||
[
|
||||
%w(http://carto.com/name.something.csv name.something.csv),
|
||||
["http://carto.com/sub/#{name1.gsub(' ', '%20')}", name1]
|
||||
].each do |url, filename|
|
||||
generator.filename_from_url(url, supported_extensions).should eq filename
|
||||
end
|
||||
end
|
||||
|
||||
it 'returns the filename for weirds URLs with filenames within the parameters (see #5704)' do
|
||||
filename = '1259030001_MB_2011_ASGC_NSW_csv.zip'
|
||||
weird_url = "http://www.abs.gov.au/ausstats/subscriber.nsf/log?openagent&"\
|
||||
"#{filename}"\
|
||||
"&1259.0.30.001&Data%20Cubes&2787F2FFF3F6E607CA2578CC001268ED&0&July%202011&05.10.2011&Latest"
|
||||
[[weird_url, filename]].each do |url, filename|
|
||||
generator.filename_from_url(url, supported_extensions).should eq filename
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in new issue