# encoding: utf-8
module Github
# The Release Assets API
class Repos::Releases::Assets < API
VALID_ASSET_PARAM_NAMES = %w[
name
label
content_type
].freeze # :nodoc:
# List assets for a release
#
# = Examples
# github = Github.new
# github.repos.releases.assets.list 'owner', 'repo', 'id'
# github.repos.releases.assets.list 'owner', 'repo', 'id' { |asset| ... }
#
def list(*args)
params = arguments(args, required: [:owner, :repo, :id]).params
response = get_request("/repos/#{owner}/#{repo}/releases/#{id}/assets", params)
return response unless block_given?
response.each { |el| yield el }
end
alias :all :list
# Get a single release asset
#
# = Examples
# github = Github.new
# github.repos.releases.assets.get 'owner', 'repo', 'id'
#
def get(*args)
params = arguments(args, required: [:owner, :repo, :id]).params
get_request("/repos/#{owner}/#{repo}/releases/assets/#{id}" , params)
end
alias :find :get
# Upload a release asset
#
# = Inputs
# * :name - Required string - The file name of the asset
# * :content_type - Required string - The content type
# of the asset. Example: “application/zip”.
#
# = Examples
# github = Github.new
# github.repos.releases.assets.upload 'owner', 'repo', 'id', 'file-path'
# "name": "batman.jpg",
# "content_type": "application/octet-stream"
#
def upload(*args)
arguments(args, required: [:owner, :repo, :id, :filepath]) do
sift VALID_ASSET_PARAM_NAMES
end
params = arguments.params
unless type = params['content_type']
type = infer_media(filepath)
end
file = Faraday::UploadIO.new(filepath, type)
options = {
headers: { content_type: type },
endpoint: 'https://uploads.github.com',
query: {'name' => params['name']}
}
params['data'] = file.read
params['options'] = options
post_request("/repos/#{owner}/#{repo}/releases/#{id}/assets", params)
ensure
file.close if file
end
# Infer media type of the asset
#
def infer_media(filepath)
require 'mime/types'
types = MIME::Types.type_for(filepath)
types.empty? ? 'application/octet-stream' : types.first
rescue LoadError
raise Github::Error::UnknownMedia.new(filepath)
end
# Edit a release asset
#
# = Inputs
# * :name - Required string - the filename of the asset
# * :label - Optional string - An alternate short description of
# the asset. Used in place of the filename.
#
# = Examples
# github = Github.new
# github.repos.releases.assets.edit 'owner', 'repo', 'id',
# "name": "foo-1.0.0-osx.zip",
# "label": "Mac binary"
#
def edit(*args)
arguments(args, required: [:owner, :repo, :id]) do
sift VALID_ASSET_PARAM_NAMES
end
params = arguments.params
patch_request("/repos/#{owner}/#{repo}/releases/assets/#{id}", params)
end
alias :update :edit
# Delete a release asset
#
# = Examples
# github = Github.new
# github.repos.releases.assets.delete 'owner', 'repo', 'id'
#
def delete(*args)
params = arguments(args, required: [:owner, :repo, :id]).params
delete_request("/repos/#{owner}/#{repo}/releases/assets/#{id}", params)
end
end # Repos::Statuses
end # Github