class Gemstash::SpecsBuilder

Builds a Marshal’ed and GZipped array of arrays containing specs as:

name, Gem::Version, platform

Attributes

result[R]

Public Class Methods

invalidate_stored() click to toggle source
# File lib/gemstash/specs_builder.rb, line 21
def self.invalidate_stored
  storage = Gemstash::Storage.for("private").for("specs_collection")
  storage.resource("specs.4.8.gz").delete(:specs)
  storage.resource("latest_specs.4.8.gz").delete(:specs)
  storage.resource("prerelease_specs.4.8.gz").delete(:specs)
end
new(auth, prerelease: false, latest: false) click to toggle source
# File lib/gemstash/specs_builder.rb, line 28
def initialize(auth, prerelease: false, latest: false)
  @auth = auth
  @prerelease = prerelease
  @latest = latest
end
serve(app) click to toggle source
# File lib/gemstash/specs_builder.rb, line 14
def self.serve(app)
  prerelease = app.params.fetch(:prerelease, false)
  latest = app.params.fetch(:latest, false)
  app.content_type "application/octet-stream"
  new(app.auth, prerelease: prerelease, latest: latest).serve
end

Public Instance Methods

serve() click to toggle source
# File lib/gemstash/specs_builder.rb, line 34
def serve
  check_auth if gemstash_env.config[:protected_fetch]
  fetch_from_storage
  return result if result

  fetch_versions
  marshal
  gzip
  store_result
  result
end

Private Instance Methods

check_auth() click to toggle source
# File lib/gemstash/specs_builder.rb, line 99
def check_auth
  @auth.check("fetch")
end
fetch_from_storage() click to toggle source
# File lib/gemstash/specs_builder.rb, line 62
def fetch_from_storage
  specs = fetch_resource
  return unless specs.exist?(:specs)

  @result = specs.load(:specs).content(:specs)
rescue StandardError
  # On the off-chance of a race condition between specs.exist? and specs.load
  @result = nil
end
fetch_resource() click to toggle source
# File lib/gemstash/specs_builder.rb, line 52
def fetch_resource
  if @latest
    storage.resource("latest_specs.4.8.gz")
  elsif @prerelease
    storage.resource("prerelease_specs.4.8.gz")
  else
    storage.resource("specs.4.8.gz")
  end
end
fetch_versions() click to toggle source
# File lib/gemstash/specs_builder.rb, line 72
def fetch_versions
  @versions = Gemstash::DB::Version.for_spec_collection(prerelease: @prerelease, latest: @latest).map(&:to_spec)
end
gzip() click to toggle source
# File lib/gemstash/specs_builder.rb, line 80
def gzip
  @result ||= begin
    output = StringIO.new
    gz = Zlib::GzipWriter.new(output)

    begin
      gz.write(@marshal)
    ensure
      gz.close
    end

    output.string
  end
end
marshal() click to toggle source
# File lib/gemstash/specs_builder.rb, line 76
def marshal
  @marshal ||= Marshal.dump(@versions)
end
storage() click to toggle source
# File lib/gemstash/specs_builder.rb, line 48
def storage
  @storage ||= Gemstash::Storage.for("private").for("specs_collection")
end
store_result() click to toggle source
# File lib/gemstash/specs_builder.rb, line 95
def store_result
  fetch_resource.save(specs: @result)
end