lib/unicoder/downloader.rb in unicoder-0.1.0 vs lib/unicoder/downloader.rb in unicoder-1.0.0

- old
+ new

@@ -1,28 +1,74 @@ require "open-uri" require "fileutils" +require "zip" module Unicoder module Downloader def self.fetch(identifier, unicode_version: CURRENT_UNICODE_VERSION, + emoji_version: CURRENT_EMOJI_VERSION, destination_directory: LOCAL_DATA_DIRECTORY, destination: nil, filename: nil ) filename = UNICODE_FILES[identifier.to_sym] || filename raise ArgumentError, "No valid file identifier or filename given" if !filename - filename.sub! 'VERSION', unicode_version - source = UNICODE_DATA_ENDPOINT + filename - destination ||= destination_directory + filename + filename = filename.dup + filename.sub! 'UNICODE_VERSION', unicode_version + filename.sub! 'EMOJI_VERSION', emoji_version + filename.sub! 'EMOJI_RELATED_VERSION', EMOJI_RELATED_UNICODE_VERSIONS[emoji_version] + if filename =~ /\A(https?|ftp):\/\// + source = filename + destination ||= destination_directory + filename.sub(/\A(https?|ftp):\//, "") + else + source = UNICODE_DATA_ENDPOINT + filename + destination ||= destination_directory + filename + end - open(source){ |f| - FileUtils.mkdir_p(File.dirname(destination)) - File.write(destination, f.read) - } - puts "GET #{source} => #{destination}" + + if source =~ %r[^(?<outer_path>.*).zip/(?<inner_path>.*)$] + # Too much magic, download unzip zip files + zip = true + source = $~[:outer_path] + ".zip" + inner_zip_filename = $~[:inner_path] + if destination =~ %r[^(?<outer_path>.*).zip/(?<inner_path>.*)$] + destination = $~[:outer_path] + ".zip" + destination_files = $~[:outer_path] + else + raise "uncoder bug" + end + else + zip = false + end + + if File.exist?(destination) + puts "Skipping download of #{source} (already exists)" + else + URI.open(source){ |f| + FileUtils.mkdir_p(File.dirname(destination)) + File.write(destination, f.read) + } + end + + if zip + unzip(destination, [inner_zip_filename], destination_files) + end rescue => e $stderr.puts "#{e.class}: #{e.message}" + end + + def self.unzip(archive, files, destination_dir) + Zip::File.open(archive) do |zip| + zip.each do |file_in_zip| + if files.include?(file_in_zip.name) + FileUtils.mkdir_p(destination_dir) + puts "Extract #{file_in_zip.name}" + file_in_zip.extract(destination_dir + "/#{file_in_zip.name}") + end + end + # entry = zip.glob('*.csv').first + end end end end