class ArTTY::Cache

Public Class Methods

new(file = nil) click to toggle source
Calls superclass method
# File lib/arTTY/cache.rb, line 80
def initialize(file = nil)
    file ||= "#{ENV["HOME"]}/.cache/arTTY/art.json"
    @defaults = {
        "art" => Hash.new,
        "version" => ArTTY.current_version
    }

    @cachefile = Pathname.new(file).expand_path
    @cachedir = @cachefile.dirname
    @imagesdir = "arTTY_images"
    super(@cachefile, false)

    refresh if (get_version != ArTTY.current_version)
end

Public Instance Methods

art() click to toggle source
# File lib/arTTY/cache.rb, line 16
def art
    return get_art.keys.sort
end
get_file_for(name) click to toggle source
# File lib/arTTY/cache.rb, line 68
def get_file_for(name)
    return get_art[name]["file"]
end
get_height_for(name) click to toggle source
# File lib/arTTY/cache.rb, line 72
def get_height_for(name)
    return get_art[name]["height"]
end
get_width_for(name) click to toggle source
# File lib/arTTY/cache.rb, line 76
def get_width_for(name)
    return get_art[name]["width"]
end
refresh(download = false) click to toggle source
# File lib/arTTY/cache.rb, line 95
def refresh(download = false)
    download_and_extract if (download)

    set_art(Hash.new)
    set_version(ArTTY.current_version)

    [
        "#{@cachedir}/#{@imagesdir}",
        "#{ENV["HOME"]}/.config/arTTY/#{@imagesdir}"
    ].each do |dir|
        Dir["#{dir}/**/*.json"].each do |file|
            img = ArTTY::Art.new(file)
            get_art[img.name] = {
                "file" => file,
                "height" => img.height,
                "width" => img.width
            }
        end
    end

    save
end

Private Instance Methods

download_and_extract() click to toggle source
# File lib/arTTY/cache.rb, line 20
def download_and_extract
    # Temporary working directory
    new = Pathname.new(
        "#{@cachedir}/#{@imagesdir}.new"
    ).expand_path
    FileUtils.rm_rf(new) if (new && new.exist?)

    # Download newest tarball
    request = Typhoeus::Request.new(
        [
            "https://gitlab.com/mjwhitta/arTTY_images/-",
            "archive/master/arTTY_images.tgz"
        ].join("/"),
        timeout: 10
    )
    request.on_headers do |response|
        if (response.code != 200)
            raise ArTTY::Error::FailedToDownload.new
        end
    end
    tgz = StringIO.new(request.run.body)
    raise ArTTY::Error::FailedToDownload.new if (tgz.eof?)

    # Extract new art
    tar = Minitar::Input.new(Zlib::GzipReader.new(tgz))
    tar.each do |entry|
        case entry.name
        when /.+\.json\s*$/
            entry.name.gsub!(/^.*generated\//, "")
            entry.prefix.gsub!(/^.*generated\//, "")
            tar.extract_entry(new, entry)
        end
    end

    # Move new art to final location
    old = Pathname.new("#{@cachedir}/#{@imagesdir}").expand_path
    if (new.exist?)
        FileUtils.rm_rf(old) if (old.exist?)
        FileUtils.mv(new, old)
    end
rescue Interrupt
    raise
ensure
    # Cleanup
    FileUtils.rm_rf(new) if (new && new.exist?)
end