lib/twitter_cldr/resources/requirements/cldr_requirement.rb
# encoding: UTF-8
# Copyright 2012 Twitter, Inc
# http://www.apache.org/licenses/LICENSE-2.0
require 'i18n'
require 'net/ftp'
require 'nokogiri'
require 'tempfile'
require 'uri'
require 'zip'
module TwitterCldr
module Resources
module Requirements
class CldrRequirement
CLDR_URL = "ftp://unicode.org/Public/cldr/%{version}/core.zip".freeze
attr_reader :version
def initialize(version)
@version = version
end
def prepare
# download and unzip if source directory doesn't exist
unless File.directory?(source_path)
STDOUT.write("Downloading cldr v#{version}... ")
download
puts 'done'
end
puts "Using cldr v#{version} from #{source_path}"
end
def source_path
@source_path ||= File.join(TwitterCldr::VENDOR_DIR, "cldr_v#{version}")
end
def common_path
File.join(source_path, 'common')
end
def alt?(node)
!node.attribute('alt').nil?
end
def draft?(node)
draft = node.attribute('draft')
draft && (
draft.value == 'unconfirmed' || draft.value == 'provisional'
)
end
def build_data(locale, &block)
CldrDataBuilder.new(locale_for(locale)).merge_each_ancestor(&block)
end
def docset(path, root_locale)
CldrDocumentSet.new(path, locale_for(root_locale), self)
end
def dtd
@dtd ||= CldrDTD.new(self)
end
private
def locale_for(locale)
locales[locale] ||= CldrLocale.new(locale, self)
end
def locales
@locales ||= {}
end
def cldr_url
CLDR_URL % { version: version }
end
def download
FileUtils.mkdir_p(source_path)
uri = URI(cldr_url)
ext_name = File.extname(cldr_url)
file_name = File.basename(cldr_url).chomp(ext_name)
Net::FTP.open(uri.host) do |ftp|
ftp.login
Tempfile.open([file_name, ext_name]) do |tmp|
ftp.getbinaryfile(uri.path, tmp.path)
Zip::File.open(tmp.path) do |file|
file.each do |entry|
path = File.join(source_path, entry.name)
FileUtils.mkdir_p(File.dirname(path))
file.extract(entry, path)
end
end
end
end
end
end
end
end
end