blob: 10229aa4a90c9d7196969152e70202ae32101580 [file] [log] [blame]
require 'digest'
module Pod
module Downloader
# This class represents a download request for a given Pod.
#
class Request
# @return [Specification,Nil] The specification for the pod whose download
# is being requested.
#
attr_reader :spec
# @return [Boolean] Whether this download request is for a released pod.
#
attr_reader :released_pod
alias_method :released_pod?, :released_pod
# @return [String] The name of the pod whose dowload is being requested.
#
attr_reader :name
# @return [Hash<Symbol, String>] The download parameters for this request.
#
attr_reader :params
# Initialize a new instance
#
# @param [Specification,Nil] spec
# see {#spec}
#
# @param [Boolean] released
# see {#released_pod}
#
# @param [String,Nil] name
# see {#name}
#
# @param [Hash<Symbol,String>,Nil] params
# see {#params}
#
def initialize(spec: nil, released: false, name: nil, params: false)
@released_pod = released
@spec = spec
@params = spec ? (spec.source && spec.source.dup) : params
@name = spec ? spec.name : name
validate!
end
# @param [String] name
# the name of the pod being downloaded.
#
# @param [Hash<#to_s, #to_s>] params
# the download parameters of the pod being downloaded.
#
# @param [Specification] spec
# the specification of the pod being downloaded.
#
# @return [String] The slug used to store the files resulting from this
# download request.
#
def slug(name: self.name, params: self.params, spec: self.spec)
checksum = spec && spec.checksum && '-' << spec.checksum[0, 5]
if released_pod?
"Release/#{name}/#{spec.version}#{checksum}"
else
opts = params.to_a.sort_by(&:first).map { |k, v| "#{k}=#{v}" }.join('-')
digest = Digest::MD5.hexdigest(opts)
"External/#{name}/#{digest}#{checksum}"
end
end
private
# Validates that the given request is well-formed.
#
# @return [Void]
#
def validate!
raise ArgumentError, 'Requires a name' unless name
raise ArgumentError, 'Must give a spec for a released download request' if released_pod? && !spec
raise ArgumentError, 'Requires a version if released' if released_pod? && !spec.version
raise ArgumentError, 'Requires params' unless params
end
end
end
end