class Jira::Command::New

Attributes

options[RW]
ticket[RW]

Public Class Methods

new(options) click to toggle source
# File lib/jira/commands/new.rb, line 23
def initialize(options)
  self.options = options
end

Public Instance Methods

run() click to toggle source
# File lib/jira/commands/new.rb, line 27
def run
  return if metadata.empty?
  return if project.nil? || project.empty?
  return if project_metadata.empty?
  components # Select components if any after a project
  return if issue_type.nil? || issue_type.empty?
  return if assign_parent? && parent.empty?
  return if summary.empty?

  api.post 'issue',
    params: params,
    success: on_success,
    failure: on_failure
end

Private Instance Methods

assign?() click to toggle source
# File lib/jira/commands/new.rb, line 67
def assign?
  Command::Assign.new(ticket, options).run if !options['assignee'].nil? || io.yes?('Assign?')
end
assign_parent?() click to toggle source
# File lib/jira/commands/new.rb, line 122
def assign_parent?
  return false unless issue_type['subtask']
  return false if options['parent'].nil? && io.no?('Set parent of subtask?')
  true
end
components() click to toggle source
# File lib/jira/commands/new.rb, line 104
def components
  @components ||= (
    components = {}
    project_metadata['components'].each do |component|
      components[component['name']] = { 'id' => component['id'] }
    end
    unless components.empty?
      if options['components'].nil?
        components = io.multi_select("Select component(s):", components)
      else
        components.select! { |k| options['components'].include?(k) }
        components = components.values
      end
    end
    components.to_a
  )
end
description() click to toggle source
# File lib/jira/commands/new.rb, line 152
def description
  @description ||= (
    options['description'] ||
      (io.ask("Description:", default: '') if options['summary'].nil?) ||
      ""
  )
end
issue_type() click to toggle source
# File lib/jira/commands/new.rb, line 132
def issue_type
  @issue_type ||= issue_types[
      options['issuetype'] || io.select("Select an issue type:", issue_types.keys)
  ]
end
issue_types() click to toggle source
# File lib/jira/commands/new.rb, line 138
def issue_types
  @issue_types ||= (
    issue_types = {}
    project['issues'].each do |issue_type|
      issue_types[issue_type['name']] = issue_type
    end
    issue_types
  )
end
metadata() click to toggle source
# File lib/jira/commands/new.rb, line 75
def metadata
  # TODO: {} on 200 but jira error
  @metadata ||= api.get('issue/createmeta')
end
on_failure() click to toggle source
# File lib/jira/commands/new.rb, line 71
def on_failure
  ->{ puts "No ticket created." }
end
on_success() click to toggle source
# File lib/jira/commands/new.rb, line 59
def on_success
  ->(json) do
    self.ticket = json['key']
    io.say("Ticket #{ticket} created.")
    assign? if options.empty? || !options['assignee'].nil?
  end
end
params() click to toggle source
# File lib/jira/commands/new.rb, line 46
def params
  {
    fields: {
      project:     { id: project['id'] },
      issuetype:   { id: issue_type['id'] },
      summary:     summary,
      description: description,
      parent:      @parent.nil? ? nil : { key: @parent },
      components:  @components.nil? ? nil : @components
    }.delete_if{|_,v| v.nil? || v.eql?([])}
  }
end
parent() click to toggle source
# File lib/jira/commands/new.rb, line 128
def parent
  @parent ||= options['parent'] || io.ask('Subtask parent:')
end
project() click to toggle source
# File lib/jira/commands/new.rb, line 80
def project
  @project ||= projects[
    options['project'] || io.select("Select a project:", projects.keys)
  ]
end
project_metadata() click to toggle source
# File lib/jira/commands/new.rb, line 99
def project_metadata
  id = project['id']
  @project_metadata ||= api.get("project/#{id}")
end
projects() click to toggle source
# File lib/jira/commands/new.rb, line 86
def projects
  @projects ||= (
    projects = {}
    metadata['projects'].each do |project|
      projects[project['name']] = {
        'id'     => project['id'],
        'issues' => project['issuetypes']
      }
    end
    projects
  )
end
summary() click to toggle source
# File lib/jira/commands/new.rb, line 148
def summary
  @summary ||= options['summary'] || io.ask("Summary:", default: '')
end