leoniv/ass_updater

View on GitHub
lib/ass_updater/update_history.rb

Summary

Maintainability
A
25 mins
Test Coverage
#-- incoding utf-8

class AssUpdater
  #
  # Handle fo updtade history from v8upd11.xml
  # @note (see AssUpdater::UpdateInfoService)
  #
  class UpdateHistory < AssUpdater::UpdateInfoService
    # Returm min distrib version from update history
    # @return [AssUpdater::AssVersion]
    def min_version
      all_versions.min
    end

    # Return max version from update histry
    # @return [AssUpdater::AssVersion]
    def max_version
      all_versions.max
    end

    # Return all versions found in histry
    # @return [Array<AssUpdater::AssVersion>]
    def all_versions
      r = []
      raw['update'].each do |h|
        r << h['version']
      end
      AssUpdater::AssVersion.convert_array r
    end

    # Return info about version <version>
    # @param version [String,AssUpdater::AssVersion]
    # @return [Hash]
    # @raise [AssUpdater::Error] if info for version not found
    def [](version)
      return [min_version] if version.to_s == '0.0.0.0'
      raw['update'].each do |h|
        next if h['version'] != version.to_s
        h['target'] = [] << h['target'] if h['target'].is_a? String
        return h
      end
      fail AssUpdater::Error, "Unkown version number `#{version}'"
    end

    # Return array of target versions for update to version <version>
    # @param version [String,AssUpdater::AssVersion]
    # @return [Array<AssUpdater::AssVersion>]
    # @note (see #ex
    def target(version)
      exclude_unknown_version(
        AssUpdater::AssVersion.convert_array self[version]['target']
      )
    end

    private

    # @note Often ['target'] containe incorrect version number
    #  not fonded in {#all_versions}.
    #
    def exclude_unknown_version(a)
      a.map do |i|
        i if all_versions.index(i)
      end.compact
    end

    def parse
      r = Nori.new(parser: :rexml,
                   strip_namespaces: true).parse(get)['updateList']
      r['update'] = [] << r['update'] if r['update'].is_a? Hash
      r
    end

    def get
      zip_f = Tempfile.new('upd11_zip')
      begin
        zip_f.write(ass_updater.http.get("#{updateinfo_path}/#{UPD11_ZIP}"))
        zip_f.rewind
        xml = unzip(zip_f)
      ensure
        zip_f.close
        zip_f.unlink
      end
      xml.force_encoding 'UTF-8'
    end

    def unzip(zip_f)
      xml = ''
      Zip::File.open(zip_f.path) do |zf|
        upd11_zip = zf.glob('v8cscdsc.xml').first
        unless upd11_zip
          fail AssUpdater::Error,
               "File `v8cscdsc.xml' not fount in zip `#{UPD11_ZIP}'"
        end
        xml = upd11_zip.get_input_stream.read
      end
      xml
    end
  end
end