# encoding: utf-8
module Github
class Client::Issues < API
require_all 'github_api/client/issues',
'assignees',
'comments',
'events',
'labels',
'milestones'
VALID_ISSUE_PARAM_NAMES = %w[
assignee
body
creator
direction
filter
labels
milestone
mentioned
mime_type
org
resource
since
sort
state
title
].freeze
VALID_ISSUE_PARAM_VALUES = {
'filter' => %w[ assigned created mentioned subscribed all ],
'state' => %w[ open closed all ],
'sort' => %w[ created updated comments ],
'direction' => %w[ desc asc ],
'since' => %r{\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z}
}
# Access to Issues::Assignees API
namespace :assignees
# Access to Issues::Comments API
namespace :comments
# Access to Issues::Events API
namespace :events
# Access to Issues::Comments API
namespace :labels
# Access to Issues::Comments API
namespace :milestones
# List your issues
#
# List all issues across all the authenticated user’s visible repositories
# including owned repositories, member repositories,
# and organization repositories.
#
# @example
# github = Github.new oauth_token: '...'
# github.issues.list
#
# List all issues across owned and member repositories for the
# authenticated user.
#
# @example
# github = Github.new oauth_token: '...'
# github.issues.list :user
#
# List all issues for a given organization for the authenticated user.
#
# @example
# github = Github.new oauth_token: '...'
# github.issues.list org: 'org-name'
#
# List issues for a repository
#
# @example
# github = Github.new
# github.issues.list user: 'user-name', repo: 'repo-name'
#
# @param [Hash] params
# @option params [String] :filter
# * assigned Issues assigned to you (default)
# * created Issues created by you
# * mentioned Issues mentioning you
# * subscribed Issues you've subscribed to updates for
# * all All issues the user can see
# @option params [String] :milestone
# * Integer Milestone number
# * none for Issues with no Milestone.
# * * for Issues with any Milestone
# @option params [String] :state
# open, closed, default: open
# @option params [String] :labels
# String list of comma separated Label names. Example: bug,ui,@high
# @option params [String] :assignee
# * String User login
# * none for Issues with no assigned User.
# * * for Issues with any assigned User.
# @option params [String] :creator
# String User login
# @option params [String] :mentioned
# String User login
# @option params [String] :sort
# created, updated, comments, default: created
# @option params [String] :direction
# asc, desc, default: desc
# @option params [String] :since
# Optional string of a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ
#
# @example
# github = Github.new oauth_token: '...'
# github.issues.list since: '2011-04-12T12:12:12Z',
# filter: 'created',
# state: 'open',
# labels: "bug,ui,bla",
# sort: 'comments',
# direction: 'asc'
#
# @api public
def list(*args)
params = arguments(args) do
assert_values VALID_ISSUE_PARAM_VALUES
end.params
response = if (org = params.delete('org'))
get_request("/orgs/#{org}/issues", params)
elsif (user_name = params.delete('user')) &&
(repo_name = params.delete('repo'))
list_repo user_name, repo_name
elsif args.include? :user
get_request("/user/issues", params)
else
get_request("/issues", params)
end
return response unless block_given?
response.each { |el| yield el }
end
alias :all :list
# List issues for a repository
#
# def list_repo(user_name, repo_name, params)
def list_repo(user, repo)
get_request("/repos/#{user}/#{repo}/issues", arguments.params)
end
private :list_repo
# Get a single issue
#
# @example
# github = Github.new
# github.issues.get 'user-name', 'repo-name', 'number'
#
def get(*args)
arguments(args, required: [:user, :repo, :number])
get_request("/repos/#{arguments.user}/#{arguments.repo}/issues/#{arguments.number}", arguments.params)
end
alias :find :get
# Create an issue
#
# @param [Hash] params
# @option params [String] :title
# Required string
# @option params [String] :body
# Optional string
# @option params [String] :assignee
# Optional string - Login for the user that this issue should be
# assigned to. Only users with push access can set the assignee for
# new issues. The assignee is silently dropped otherwise.
# @option params [Number] :milestone
# Optional number - Milestone to associate this issue with.
# Only users with push access can set the milestone for new issues.
# The milestone is silently dropped otherwise.
# @option params [Array[String]] :labels
# Optional array of strings - Labels to associate with this issue
# Only users with push access can set labels for new issues.
# Labels are silently dropped otherwise.
#
# @example
# github = Github.new user: 'user-name', repo: 'repo-name'
# github.issues.create
# title: "Found a bug",
# body: "I'm having a problem with this.",
# assignee: "octocat",
# milestone: 1,
# labels: [
# "Label1",
# "Label2"
# ]
#
def create(*args)
arguments(args, required: [:user, :repo]) do
permit VALID_ISSUE_PARAM_NAMES
assert_required %w[ title ]
end
post_request("/repos/#{arguments.user}/#{arguments.repo}/issues", arguments.params)
end
# Edit an issue
#
# @param [Hash] params
# @option params [String] :title
# Optional string
# @option params [String] :body
# Optional string
# @option params [String] :assignee
# Optional string - Login for the user that this issue should be assigned to.
# @option params [String] :state
# Optional string - State of the issue: open or closed
# @option params [Number] :milestone
# Optional number - Milestone to associate this issue with
# @option params [Array[String]] :labels
# Optional array of strings - Labels to associate with this issue.
# Pass one or more Labels to replace the set of Labels on this Issue.
# Send an empty array ([]) to clear all Labels from the Issue.
#
# @example
# github = Github.new
# github.issues.edit 'user-name', 'repo-name', 'number'
# title: "Found a bug",
# body: "I'm having a problem with this.",
# assignee: "octocat",
# milestone: 1,
# labels": [
# "Label1",
# "Label2"
# ]
#
# @api public
def edit(*args)
arguments(args, required: [:user, :repo, :number]) do
permit VALID_ISSUE_PARAM_NAMES
end
patch_request("/repos/#{arguments.user}/#{arguments.repo}/issues/#{arguments.number}", arguments.params)
end
end # Issues
end # Github