lib/countries/sources/cldr/subdivision_updater.rb



# frozen_string_literal: true

require 'active_support'
require 'active_support/core_ext/hash/deep_merge'
require 'nokogiri'
require 'pry'

module Sources
  module CLDR
    # Updates local subdivision files with data from the Unicode CLDR repository
    class SubdivisionUpdater
      def call
        d = Dir['./tmp/cldr/trunk/common/subdivisions/*.xml']
        @loader = Sources::Local::CachedLoader.new(Sources::Local::Subdivision)
        d.each { |file_path| update_locale(file_path) }
      end

      def update_locale(file_path)
        language_data = Nokogiri::XML(File.read(file_path))
        language_code = File.basename(file_path, '.*')
        subdivisions = language_data.css('subdivision')
        next if subdivisions.empty?

        last_country_code_seen = nil

        subdivisions.each_with_index do |subdivision, index|
          subdivision = Sources::CLDR::Subdivision.new(language_code: language_code, xml: subdivision)
          data = @loader.load(subdivision.country_code)
          data[subdivision.code] ||= {}
          data[subdivision.code] = data[subdivision.code].deep_merge(subdivision.to_h)
          if (last_country_code_seen && last_country_code_seen != subdivision.country_code) ||
             index == subdivisions.size - 1
            puts "Updated #{subdivision.country_code} with language_code #{language_code}"
            @loader.save(subdivision.country_code, data)
          end
          last_country_code_seen = subdivision.country_code
        end
      end
    end
  end
end