Newer
Older
namespace :geocoder do
namespace :maxmind do
desc "Download and load/refresh MaxMind GeoLite City data"
task load: [:download, :extract, :insert]
desc "Download MaxMind GeoLite City data"
task :download do
p = MaxmindTask.check_for_package!
MaxmindTask.download!(p, dir: ENV['DIR'] || "tmp/")
desc "Extract (unzip) MaxMind GeoLite City data"
task :extract do
p = MaxmindTask.check_for_package!
MaxmindTask.extract!(p, dir: ENV['DIR'] || "tmp/")
desc "Load/refresh MaxMind GeoLite City data"
task insert: [:environment] do
p = MaxmindTask.check_for_package!
MaxmindTask.insert!(p, dir: ENV['DIR'] || "tmp/")
module MaxmindTask
extend self
def check_for_package!
if %w[city country].include?(p = ENV['PACKAGE'])
return p
else
puts "Please specify PACKAGE=city or PACKAGE=country"
exit
end
end
def download!(package, options = {})
p = "geolite_#{package}_csv".intern
Geocoder::MaxmindDatabase.download(p, options[:dir])
def extract!(package, options = {})
begin
require 'zip'
rescue LoadError
puts "Please install gem: rubyzip (>= 1.0.0)"
exit
end
require 'fileutils'
p = "geolite_#{package}_csv".intern
archive_filename = Geocoder::MaxmindDatabase.archive_filename(p)
Zip::File.open(File.join(options[:dir], archive_filename)).each do |entry|
filepath = File.join(options[:dir], entry.name)
if File.exist? filepath
warn "File already exists (#{entry.name}), skipping"
else
FileUtils.mkdir_p(File.dirname(filepath))
entry.extract(filepath)
end
def insert!(package, options = {})
p = "geolite_#{package}_csv".intern
Geocoder::MaxmindDatabase.insert(p, options[:dir])
end