class Jirack::Command

Public Instance Methods

assign(issue_number) click to toggle source
# File lib/jirack/command.rb, line 151
def assign(issue_number)
  cred = Jirack::Credential.new
  client = cred.jira_client

  issue = client.Issue.find("#{ cred.project_name }-#{ issue_number }")

  myself = JIRA::Resource::UserFactory.new(client).myself

  client.put("/rest/api/2/issue/#{ issue.key }/assignee", { name: myself.name }.to_json)
end
back(issue_number) click to toggle source
# File lib/jirack/command.rb, line 98
def back(issue_number)
  cred = Jirack::Credential.new
  client = cred.jira_client

  issue = client.Issue.find("#{ cred.project_name }-#{ issue_number }", { extend: 'transitions' })

  next_status = issue.status.next_status(client, cred.workflow_ids)

  next_transition =  issue.transitions.all.find {|transition| transition.to.id != next_status.id }

  transition = JIRA::Resource::Transition.new(client, :attrs => {id: next_transition.id }, :issue_id => issue.id)
  transition.save(transition: { id: next_transition.id })

  puts "#{ cred.project_name }-#{ issue_number } back to #{ next_transition.to.name }"

  # slack に通知
  if options.key? :message
    slack = Slack::Incoming::Webhooks.new cred.slack_webhook_url
    slack.post "<@#{ issue.reporter.name }> #{ issue.summary }(#{ issue_url(issue) }) #{ options[:message] }"
    puts "@#{ issue.reporter.name } #{ issue.summary }(#{ issue_url(issue) }) #{ options[:message] }"
  end
end
config() click to toggle source
# File lib/jirack/command.rb, line 13
def config
  cred = Jirack::Credential.new


  host = ask "input host (ex. 'mydomain.atlassian.net') #{ cred.host&.empty? ? '' : "(#{cred.host})" }:"
  cred.host = host unless host.empty?

  project_name = ask "input project name #{ cred.project_name&.empty? ? '' : "(#{cred.project_name})" }:"
  cred.project_name = project_name unless project_name.empty?

  username = ask "input user name #{ cred.username&.empty? ? '' : "(#{cred.username})" }:"
  cred.username = username unless username.empty?

  password = ask '(required!)input password:', echo: false
  cred.password = password

  puts ''

  slack_webhook_url = ask "input slack webhook urk #{ cred.slack_webhook_url&.empty? ? '' : "(#{cred.slack_webhook_url})" }:"
  cred.slack_webhook_url = slack_webhook_url unless slack_webhook_url.empty?

  cred.store
end
forward(issue_number) click to toggle source
# File lib/jirack/command.rb, line 72
def forward(issue_number)
  cred = Jirack::Credential.new
  client = cred.jira_client

  issue = client.Issue.find("#{ cred.project_name }-#{ issue_number }", { extend: 'transitions' })

  next_status = issue.status.next_status(client, cred.workflow_ids)

  next_transition =  issue.transitions.all.find {|transition| transition.to.id == next_status.id }

  transition = JIRA::Resource::Transition.new(client, :attrs => {id: next_transition.id }, :issue_id => issue.id)
  transition.save(transition: { id: next_transition.id })


  puts "#{ cred.project_name }-#{ issue_number } forward to #{ next_transition.to.name }"

  # slack に通知
  if options.key? :message
    slack = Slack::Incoming::Webhooks.new cred.slack_webhook_url
    slack.post "<@#{ issue.reporter.name }> #{ issue.summary }(#{ issue_url(issue) }) #{ options[:message] }"
    puts "@#{ issue.reporter.name } #{ issue.summary }(#{ issue_url(issue) }) #{ options[:message] }"
  end
end
list() click to toggle source
# File lib/jirack/command.rb, line 41
def list
  cred = Jirack::Credential.new
  client = cred.jira_client

  active_sprint =  active_sprint(client, project_board(client, cred.project_name)['id'].to_i)

  if options.key?('unassign')
    puts "#{ active_sprint['name'] } unassign issues: "
    active_unassign_issue(client, cred.project_name, active_sprint['name']).each do |issue|
      puts "%s %s %4.1f %s" % [issue.key, mb_rjust(issue.status.name, 25), issue.points, issue.summary]
    end

  elsif options.key?('sum-point')
    sum_points = active_assign_issue(client, cred.project_name, active_sprint['name']).inject(0.0) {|sum, issue| sum + issue.points }
    puts "#{ active_sprint['name'] } points: #{ sum_points }"

  elsif options.key?('all')
    puts "#{ active_sprint['name'] } issues: "
    active_sprint_issue(client, cred.project_name, active_sprint['name']).each do |issue|
      puts "%s % 18s %s %4.1f %s" % [issue.key, issue.assign_user_name, mb_rjust(issue.status.name, 25), issue.points, issue.summary]
    end
  else
    puts "#{ active_sprint['name'] } issues: "
    active_assign_issue(client, cred.project_name, active_sprint['name']).each do |issue|
      puts "%s %s %4.1f %s" % [issue.key, mb_rjust(issue.status.name, 25), issue.points, issue.summary]
    end
  end
end
notify(issue_number) click to toggle source
# File lib/jirack/command.rb, line 124
def notify(issue_number)
  cred = Jirack::Credential.new
  client = cred.jira_client

  issue = client.Issue.find("#{ cred.project_name }-#{ issue_number }")

  # slack に通知
  if options.key?(:message) && !options.key?(:silent)
    slack = Slack::Incoming::Webhooks.new cred.slack_webhook_url
    slack.post "<@#{ issue.reporter.name }> #{ issue.summary }(#{ issue_url(issue) }) #{ options[:message] }"
  end

  puts "@#{ issue.reporter.name } #{ issue.summary }(#{ issue_url(issue) }) #{ options[:message] }"
end
open(issue_number) click to toggle source
# File lib/jirack/command.rb, line 140
def open(issue_number)
  cred = Jirack::Credential.new
  client = cred.jira_client

  issue = client.Issue.find("#{ cred.project_name }-#{ issue_number }")

  Launchy.open issue_url(issue)

end

Private Instance Methods

active_assign_issue(client, project_name, sprint_name) click to toggle source
# File lib/jirack/command.rb, line 172
def active_assign_issue(client, project_name, sprint_name)
  JIRA::Resource::Issue.jql(client, "project=\"#{ project_name }\" AND assignee = currentuser() AND cf[10007] = \"#{ sprint_name }\"")
end
active_sprint(client, board_id) click to toggle source
# File lib/jirack/command.rb, line 168
def active_sprint(client, board_id)
  client.Agile.get_sprints(board_id, state: 'active')['values'].first
end
active_sprint_issue(client, project_name, sprint_name) click to toggle source
# File lib/jirack/command.rb, line 180
def active_sprint_issue(client, project_name, sprint_name)
  JIRA::Resource::Issue.jql(client, "project=\"#{ project_name }\" AND cf[10007] = \"#{ sprint_name }\" ORDER BY assignee")
end
active_unassign_issue(client, project_name, sprint_name) click to toggle source
# File lib/jirack/command.rb, line 176
def active_unassign_issue(client, project_name, sprint_name)
  JIRA::Resource::Issue.jql(client, "project=\"#{ project_name }\" AND assignee = NULL AND cf[10007] = \"#{ sprint_name }\"")
end
issue_url(issue) click to toggle source
# File lib/jirack/command.rb, line 184
def issue_url(issue)
  uri = URI.parse(issue.self)
  "https://#{ uri.host }/browse/#{ issue.key }"
end
mb_rjust(string, width, padding=' ') click to toggle source
# File lib/jirack/command.rb, line 189
def mb_rjust(string, width, padding=' ')
  output_width = string.each_char.map{|c| c.bytesize == 1 ? 1 : 2}.reduce(0, &:+)
  padding_size = [0, width - output_width].max
  padding * padding_size + string
end
project_board(client, project_name) click to toggle source
# File lib/jirack/command.rb, line 164
def project_board(client, project_name)
  client.Agile.all['values'].find {|board| board['name'] == project_name }
end