renuo/i18n-docs

View on GitHub
lib/i18n_docs/translations.rb

Summary

Maintainability
A
0 mins
Test Coverage
# Order of method calls
#  download_files
#  store_translations
#  clean_up
#
module I18nDocs
  class Translations
    attr_accessor :locales, :tmp_folder, :config_file, :csv_files

    def initialize(config_file = nil, tmp_folder = nil)
      @config_file = config_file
      @tmp_folder  = tmp_folder

      @csv_files = {}

      load_config
      load_locales
    end

    def load_locales
      @locales = []
      @locales = I18n.available_locales if defined?(I18n)
    end

    def load_config
      @settings = {}
      @settings = YAML.load_file(config_file) if File.exist?(config_file)
    end

    def download_files
      files = @settings['files']
      files.each do |target_file, url|
        # ensure .yml filename
        target_file += '.yml' if target_file !~ /\.yml$/
        # download file to tmp directory
        tmp_file = File.basename(target_file).gsub('.yml', '.csv')
        tmp_file = File.join(@tmp_folder, tmp_file)
        download(url, tmp_file)
        @csv_files[target_file] = tmp_file
      end
    end

    def store_translations
      @csv_files.each do |target_file, csv_file|
        converter = CsvToYaml.new(csv_file, target_file, @locales)
        converter.process
        converter.write_files
      end

      @csv_files
    end

    def clean_up
      # remove all tmp files
      @csv_files.each do |_target_file, csv_file|
        File.unlink(csv_file)
      end
    end

    def download(url, destination_file)
      puts "Download '#{url}' to '#{destination_file}'"
      doc_data = URI.open(url).read.force_encoding('UTF-8')
      if (subs = @settings['substitutions'])
        subs.each do |sub|
          doc_data.gsub! sub['from'], sub['to']
        end
      end
      File.open(destination_file, 'w') do |dst|
        dst.write(doc_data)
      end
    end
  end
end