# encoding: utf-8 module Github class PullRequests < API extend AutoloadHelper autoload_all 'github_api/pull_requests', :Comments => 'comments' include Github::PullRequests::Comments VALID_REQUEST_PARAM_NAMES = %w[ title body base head state issue commit_message mime_type resource ].freeze VALID_REQUEST_PARAM_VALUES = { 'state' => %w[ open closed ] } # Creates new Gists API def initialize(options = {}) super(options) end # List pull requests # # = Examples # @github = Github.new :user => 'user-name', :repo => 'repo-name' # @github.pull_requests.pull_requests # @github.pull_requests.pull_requests { |req| ... } # # @pull_reqs = Github::PullRequests.new # @pull_reqs.pull_requests 'user-name', 'repo-name' # def pull_requests(user_name, repo_name, 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_REQUEST_PARAM_NAMES, params) _merge_mime_type(:pull_request, params) _validate_params_values(VALID_REQUEST_PARAM_VALUES, params) response = get("/repos/#{user}/#{repo}/pulls", params) return response unless block_given? response.each { |el| yield el } end alias :pulls :pull_requests alias :requests :pull_requests # Get a single pull request # # = Examples # @github = Github.new # @github.pull_requests.pull_request 'user-name', 'repo-name', 'request-id' # # @pull_reqs = Github::PullRequests.new # @pull_reqs.pull_request 'user-name', 'repo-name', 'request-id' # def pull_request(user_name, repo_name, request_id, params={}) _update_user_repo_params(user_name, repo_name) _validate_user_repo_params(user, repo) unless user? && repo? _validate_presence_of request_id _normalize_params_keys(params) _merge_mime_type(:pull_request, params) get("/repos/#{user}/#{repo}/pulls/#{request_id}", params) end alias :get_pull_request :pull_request # Create a pull request # # = Inputs # * :title - Required string # * :body - Optional string # * :base - Required string - The branch you want your changes pulled into. # * :head - Required string - The branch where your changes are implemented. # note: head and base can be either a sha or a branch name. # Typically you would namespace head with a user like this: username:branch. # = Alternative Input # You can also create a Pull Request from an existing Issue by passing # an Issue number instead of title and body. # * issue - Required number - Issue number in this repository to turn into a Pull Request. # # = Examples # @github = Github.new :oauth_token => '...' # @github.pull_requests.create_request 'user-name', 'repo-name', # "title" => "Amazing new feature", # "body" => "Please pull this in!", # "head" => "octocat:new-feature", # "base" => "master" # # alternatively # # @github.pull_requests.create_request 'user-name', 'repo-name', # "issue" => "5", # "head" => "octocat:new-feature", # "base" => "master" # def create_request(user_name, repo_name, params={}) _update_user_repo_params(user_name, repo_name) _validate_user_repo_params(user, repo) unless user? && repo? _normalize_params_keys(params) _merge_mime_type(:pull_request, params) _filter_params_keys(VALID_REQUEST_PARAM_NAMES, params) post("/repos/#{user}/#{repo}/pulls", params) end alias :create_pull_request :create_request # Update a pull request # # = Inputs # * :title - Optional string # * :body - Optional string # * :state - Optional string - State of this Pull Request. Valid values are open and closed. # # = Examples # @github = Github.new :oauth_token => '...' # @github.pull_requests.update_request 'user-name', 'repo-name', 'request-id' # "title" => "Amazing new title", # "body" => "Update body", # "state" => "open", # def update_request(user_name, repo_name, request_id, params={}) _update_user_repo_params(user_name, repo_name) _validate_user_repo_params(user, repo) unless user? && repo? _validate_presence_of request_id _normalize_params_keys(params) _filter_params_keys(VALID_REQUEST_PARAM_NAMES, params) _merge_mime_type(:pull_request, params) _validate_params_values(VALID_REQUEST_PARAM_VALUES, params) patch("/repos/#{user}/#{repo}/pulls/#{request_id}", params) end alias :update_pull_request :update_request # List commits on a pull request # # = Examples # @github = Github.new # @github.pull_requests.commits 'user-name', 'repo-name', 'request-id' # def commits(user_name, repo_name, request_id, params={}) _update_user_repo_params(user_name, repo_name) _validate_user_repo_params(user, repo) unless user? && repo? _validate_presence_of request_id _normalize_params_keys(params) _merge_mime_type(:pull_request, params) response = get("/repos/#{user}/#{repo}/pulls/#{request_id}/commits", params) return response unless block_given? response.each { |el| yield el } end alias :request_commits :commits # List pull requests files # # = Examples # @github = Github.new # @github.pull_requests.request_files 'user-name', 'repo-name', 'request-id' # def files(user_name, repo_name, request_id, params={}) _update_user_repo_params(user_name, repo_name) _validate_user_repo_params(user, repo) unless user? && repo? _validate_presence_of request_id _normalize_params_keys(params) _merge_mime_type(:pull_request, params) response = get("/repos/#{user}/#{repo}/pulls/#{request_id}/files", params) return response unless block_given? response.each { |el| yield el } end alias :request_files :files # Check if pull request has been merged # # = Examples # @github = Github.new # @github.pull_requests.merged? 'user-name', 'repo-name', 'request-id' # def merged?(user_name, repo_name, request_id, params={}) _update_user_repo_params(user_name, repo_name) _validate_user_repo_params(user, repo) unless user? && repo? _validate_presence_of request_id _normalize_params_keys(params) _merge_mime_type(:pull_request, params) get("/repos/#{user}/#{repo}/pulls/#{request_id}/merge", params) true rescue Github::Error::NotFound false end # Merge a pull request(Merge Button) # # = Inputs # :commit_message - Optional string - The message that will be used for the merge commit # # = Examples # @github = Github.new # @github.pull_requests.merge 'user-name', 'repo-name', 'request-id' # def merge(user_name, repo_name, request_id, params={}) _update_user_repo_params(user_name, repo_name) _validate_user_repo_params(user, repo) unless user? && repo? _validate_presence_of request_id _normalize_params_keys(params) _merge_mime_type(:pull_request, params) _filter_params_keys(VALID_REQUEST_PARAM_NAMES, params) put("/repos/#{user}/#{repo}/pulls/#{request_id}/merge", params) end end # PullRequests end # Github