Sorry, data for that comparison is no longer available.

darrenli/jira-cli

View on GitHub
lib/jira/commands/link.rb

Summary

Maintainability
A
1 hr
Test Coverage
module Jira
  class CLI < Thor

    desc "link <ticket>", "Creates a link between two tickets in JIRA"
    def link(ticket)
      Command::Link.new(ticket).run
    end

  end

  module Command
    class Link < Base

      attr_accessor :ticket

      def initialize(ticket)
        self.ticket = ticket
      end

      def run
        return if ticket.empty?
        return if metadata.empty?
        return if issue_link_type.empty?
        return if outward_ticket.empty?
        return unless invalid_ticket?

        begin
          api.post "issueLink",
            params: params,
            success: on_success,
            failure: on_failure
        rescue CommandException
        end
      end

    private

      def params
        {
          type: {
            name: issue_link_type[:name]
          },
          inwardIssue: {
            key: ticket
          },
          outwardIssue: {
            key: outward_ticket
          }
        }
      end

      def issue_link_type
        return @issue_link_type unless @issue_link_type.nil?

        types = {}
        metadata['issueLinkTypes'].each do |type|
          data = {
            id:       type['id'],
            name:     type['name'],
            inward:   type['inward'],
            outward:  type['outward']
          }
          types[type['name']] = data
        end
        choice = io.select("Select a link type:", types.keys)
        @issue_link_type = types[choice]
      end

      def on_success
        ->{
          puts "Successfully linked ticket #{ticket} to"\
          " ticket #{outward_ticket}."
        }
      end

      def on_failure
        ->{ puts "No ticket linked." }
      end

      def outward_ticket
        @outward_ticket ||= io.ask("Outward ticket:").strip
      end

      def invalid_ticket?
        !Jira::Core.ticket?(outward_ticket)
      end

      def metadata
        @metadata ||= api.get("issueLinkType")
      end

    end
  end
end