# encoding: utf-8 module Github class Repos module Downloads REQUIRED_PARAMS = %w[ name size ] VALID_DOWNLOAD_PARAM_NAMES = %w[ name size description content_type ].freeze REQUIRED_S3_PARAMS = %w[ path acl name accesskeyid policy signature mime_type ].freeze # Status code for successful upload to Amazon S3 service SUCCESS_STATUS = 201 # List downloads for a repository # # = Examples # @github = Github.new # @github.repos.downloads 'user-name', 'repo-name' # @github.repos.downloads 'user-name', 'repo-name' { |downl| ... } # def downloads(user_name=nil, repo_name=nil, params={}) _update_user_repo_params(user_name, repo_name) _validate_user_repo_params(user, repo) unless user? && repo? _normalize_params_keys(params) response = get("/repos/#{user}/#{repo}/downloads") return response unless block_given? response.each { |el| yield el } end alias :list_downloads :downloads alias :get_downloads :downloads # Get a single download # # = Examples # @github = Github.new # @github.repos.download 'user-name', 'repo-name' # def download(user_name, repo_name, download_id, params={}) _update_user_repo_params(user_name, repo_name) _validate_user_repo_params(user, repo) unless user? && repo? _validate_presence_of download_id _normalize_params_keys(params) get("/repos/#{user}/#{repo}/downloads/#{download_id}") end alias :get_download :download # Delete download from a repository # # = Examples # @github = Github.new # @github.repos.delete_download 'user-name', 'repo-name', 'download-id' # def delete_download(user_name, repo_name, download_id, params={}) _update_user_repo_params(user_name, repo_name) _validate_user_repo_params(user, repo) unless user? && repo? _validate_presence_of download_id _normalize_params_keys(params) delete("/repos/#{user}/#{repo}/downloads/#{download_id}") end # Creating a new download is a two step process. # You must first create a new download resource using this method. # Response from this method is to be used in #upload method. # # = Inputs # * :name - Required string - name of the file that is being created. # * :size - Required number - size of file in bytes. # * :description - Optional string # * :content_type - Optional string # # = Examples # @github = Github.new # @github.repos.create_download 'user-name', 'repo-name', # "name" => "new_file.jpg", # "size" => 114034, # "description" => "Latest release", # "content_type" => "text/plain" # def create_download(user_name=nil, repo_name=nil, params={}) _update_user_repo_params(user_name, repo_name) _validate_user_repo_params(user, repo) unless user? && repo? _normalize_params_keys(params) _filter_params_keys(VALID_DOWNLOAD_PARAM_NAMES, params) raise ArgumentError, "Required parameters are: #{REQUIRED_PARAMS.join(', ')}" unless _validate_inputs(REQUIRED_PARAMS, params) post("/repos/#{user}/#{repo}/downloads", params) end # Upload a file to Amazon, using the reponse instance from # Github::Repos::Downloads#create_download. This can be done by passing # the response object as an argument to upload method. # # = Parameters # * resource - Required Hashie::Mash -resource of the create_download call # * :size - Required number - size of file in bytes. # def upload(resource, filename) _validate_presence_of resource, filename raise ArgumentError, 'Need to provied resource of Github::Repose::Downloads#create_download call' unless resource.is_a? Hashie::Mash REQUIRED_S3_PARAMS.each do |key| raise ArgumentError, "Expected following key: #{key}" unless resource.respond_to?(key) end # TODO use ordered hash if Ruby < 1.9 hash = ruby_18 { require 'active_support' ActiveSupport::OrderedHash.new } || ruby_19 { Hash.new } mapped_params = { 'key' => resource.path, 'acl' => resource.acl, 'success_action_status' => SUCCESS_STATUS, 'Filename' => resource.name, 'AWSAccessKeyId' => resource.accesskeyid, 'Policy' => resource.policy, 'Signature' => resource.signature, 'Content-Type' => resource.mime_type, 'file' => prepend_at_for(filename.to_s) } post('', mapped_params, { :url => resource.s3_url }) end alias :upload_to_s3 :upload alias :upload_to_amazon :upload private def prepend_at_for(file) /^@.*/ =~ file ? '@' + file : file end end # Downloads end # Repos end # Github