class TwitterCldr::Resources::TimezoneTestsImporter

Constants

TEST_TIME
TYPES

Public Instance Methods

execute() click to toggle source
# File lib/twitter_cldr/resources/timezone_tests_importer.rb, line 43
def execute
  check_tzdata_versions

  output_path = params.fetch(:output_path)
  FileUtils.mkdir_p(output_path)

  params[:locales].each do |locale|
    output_file = File.join(output_path, "#{locale}.yml")

    File.write(
      output_file, YAML.dump(generate_test_cases_for_locale(locale))
    )
  end
end

Private Instance Methods

check_tzdata_versions() click to toggle source
# File lib/twitter_cldr/resources/timezone_tests_importer.rb, line 60
def check_tzdata_versions
  resource_bundle = requirements[:icu].get_class('com.ibm.icu.util.UResourceBundle')
  icu_data = requirements[:icu].get_class('com.ibm.icu.impl.ICUData')
  zone_info_res_field = requirements[:icu]
    .get_class('com.ibm.icu.impl.OlsonTimeZone')
    .java_class
    .declared_field(:ZONEINFORES)

  zone_info_res_field.accessible = true
  zone_info_res = zone_info_res_field.value(nil)

  bundle = resource_bundle.getBundleInstance(
    icu_data.const_get(:ICU_BASE_NAME), zone_info_res
  )

  icu_tz_version = bundle.get('TZVersion').getString
  tzinfo_version = TZInfo::Data::Version::TZDATA

  if icu_tz_version != tzinfo_version
    raise RuntimeError, 'Timezone database versions do not match. ICU is using '\
      "#{icu_tz_version} and the tzinfo-data gem is using #{tzinfo_version}."
  end
end
generate_test_cases_for_locale(locale) click to toggle source
# File lib/twitter_cldr/resources/timezone_tests_importer.rb, line 84
def generate_test_cases_for_locale(locale)
  ulocale = ulocale_class.new(locale.to_s)

  TZInfo::Timezone.all_identifiers.each_with_object({}) do |tz_id, ret|
    tz = tz_class.getTimeZone(tz_id)
    offset = tz.getRawOffset

    ret[tz_id] = {
      offset: offset,
      **test_cases_for_zone_and_locale(tz, ulocale)
    }
  end
end
style() click to toggle source
# File lib/twitter_cldr/resources/timezone_tests_importer.rb, line 120
def style
  @style ||= timezone_format_class.const_get(:Style)
end
test_cases_for_zone_and_locale(tz, locale) click to toggle source
# File lib/twitter_cldr/resources/timezone_tests_importer.rb, line 98
def test_cases_for_zone_and_locale(tz, locale)
  tz_format = timezone_format_class.getInstance(locale)
  date = TEST_TIME.to_i * 1000

  TYPES.each_with_object({}) do |style_sym, ret|
    style_const = style.const_get(style_sym)
    ret[style_sym] = tz_format.format(style_const, tz, date)
  end
end
timezone_format_class() click to toggle source
# File lib/twitter_cldr/resources/timezone_tests_importer.rb, line 116
def timezone_format_class
  @timezone_format ||= requirements[:icu].get_class('com.ibm.icu.text.TimeZoneFormat')
end
tz_class() click to toggle source
# File lib/twitter_cldr/resources/timezone_tests_importer.rb, line 108
def tz_class
  @tz_class ||= requirements[:icu].get_class('com.ibm.icu.util.TimeZone')
end
ulocale_class() click to toggle source
# File lib/twitter_cldr/resources/timezone_tests_importer.rb, line 112
def ulocale_class
  @ulocale_class ||= requirements[:icu].get_class('com.ibm.icu.util.ULocale')
end