1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
namespace :postal_codes do
desc 'Retrieve and update postal codes and their format'
task :update do
require 'json'
require 'open-uri'
require 'yaml'
country_files = Dir['lib/countries/data/countries/*.yaml'].sort
country_files.each do |country_file|
yaml = YAML.load_file(country_file)
country_code = File.basename(country_file, File.extname(country_file))
print "\rUpdating #{country_code}"
data = yaml[country_code].to_a
postal_code_index = data.find_index { |d| d[0] == 'postal_code' }
postal_code_format_index = data.find_index { |d| d[0] == 'postal_code_format' }
response = URI.open("https://chromium-i18n.appspot.com/ssl-address/data/#{country_code}").read
json = JSON.parse(response) rescue {}
puts ' - Returned empty data. Skipping ' and next if json.empty?
postal_code = ['postal_code', !!json['zip']]
postal_code_format = ['postal_code_format', json['zip']]
if postal_code_index
data[postal_code_index] = postal_code
else
postal_code_index = data.find_index { |d| d[0] == 'nationality' } + 1 || data.size
data.insert(postal_code_index, postal_code)
end
if json['zip']
if postal_code_format_index
data[postal_code_format_index] = postal_code_format
else
data.insert(postal_code_index + 1, postal_code_format)
end
elsif postal_code_format_index
data.delete_at(postal_code_format_index)
end
yaml[country_code] = data.to_h
File.open(country_file, 'w') { |file| file.write(yaml.to_yaml) }
end
end
end
|