Sha256: 23e0294a47dc00ea848398176a6f81df34843ce591418c4bc74433abe65c2b68

Contents?: true

Size: 1.5 KB

Versions: 13

Compression:

Stored size: 1.5 KB

Contents

require 'fileutils'
require 'tmpdir'
require 'tempfile'

module S3Repo
  ##
  # Cache object, stores S3 objects on disk
  class Cache < Base
    TMPDIRS = [ENV['S3REPO_TMPDIR'], ENV['TMPDIR'], Dir.tmpdir, '/tmp/s3repo']

    def initialize(params = {})
      super
      [partialdir, cachedir].each { |x| FileUtils.mkdir_p x }
    end

    def serve(key, refresh = true)
      File.open(download(key, refresh)) { |fh| fh.read }
    rescue Aws::S3::Errors::NoSuchKey
      nil
    end

    private

    def download(key, refresh = true)
      path = expand_path key
      get_object(key, path) if refresh || !cached?(path)
      path
    end

    def expand_path(key)
      File.absolute_path(key, cachedir)
    end

    def cached?(path)
      File.exist? path
    end

    def get_object(key, path)
      FileUtils.mkdir_p File.dirname(path)
      object = atomic_get_object(key, path)
      etags[key] = object.etag
    rescue Aws::S3::Errors::NotModified
      return
    end

    def atomic_get_object(key, path)
      tmpfile = Tempfile.create(key, partialdir)
      object = client.get_object(
        key: key, if_none_match: etags[key], response_target: tmpfile
      )
      tmpfile.close
      File.rename tmpfile.path, path
      object
    end

    def etags
      @etags ||= {}
    end

    def cachedir
      File.join(tmpdir, 'cache')
    end

    def partialdir
      File.join(tmpdir, 'partial')
    end

    def tmpdir
      @tmpdir ||= File.absolute_path(@options[:tmpdir] || TMPDIRS.compact.first)
    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
s3repo-0.3.4 lib/s3repo/cache.rb
s3repo-0.3.3 lib/s3repo/cache.rb
s3repo-0.3.2 lib/s3repo/cache.rb
s3repo-0.3.1 lib/s3repo/cache.rb
s3repo-0.3.0 lib/s3repo/cache.rb
s3repo-0.2.0 lib/s3repo/cache.rb
s3repo-0.1.7 lib/s3repo/cache.rb
s3repo-0.1.5 lib/s3repo/cache.rb
s3repo-0.1.4 lib/s3repo/cache.rb
s3repo-0.1.3 lib/s3repo/cache.rb
s3repo-0.1.2 lib/s3repo/cache.rb
s3repo-0.1.1 lib/s3repo/cache.rb
s3repo-0.1.0 lib/s3repo/cache.rb