class Toolshed::Commands::CreatePullRequest

Allow a user to create pull request based on information in .toolshedrc and prompts

Attributes

git_tool[RW]
pull_request_body[RW]
pull_request_title[RW]
pull_request_url[RW]
ticket_id[RW]
ticket_tracker[RW]
ticket_tracker_class[RW]
ticket_tracker_project_id[RW]
ticket_tracking_title[RW]
ticket_tracking_url[RW]

Public Class Methods

cli_options() click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 21
def self.cli_options # rubocop:disable Metrics/MethodLength
  {
    banner: 'Usage: push_branch [options]',
    options: {
      tool: {
        short_on: '-a'
      },
      ticket_system: {
        short_on: '-m'
      },
      use_defaults: {
        short_on: '-d'
      },
      title: {
        short_on: '-t'
      },
      body: {
        short_on: '-b'
      },
      skip_ticket: {
        short_on: '-s',
        default: true
      }
    }
  }
end
new(options = {}) click to toggle source
Calls superclass method Toolshed::Commands::Base::new
# File lib/toolshed/commands/create_pull_request.rb, line 15
def initialize(options = {})
  super(options)
  self.ticket_tracker_class = nil
  self.pull_request_url = ''
end

Public Instance Methods

branch() click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 48
def branch
  @branch ||= Toolshed::Git::Branch.new
end
execute(_args, options = {}) click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 52
def execute(_args, options = {})
  output_begining_messages
  options = execute_ticket_tracking(options)
  execute_pull_request(options) unless options.nil?
end

Private Instance Methods

add_note_to_ticket() click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 119
def add_note_to_ticket
  add_note_to_ticket_response = read_user_input_add_note_to_ticket('Would you like to add a note with the pull request url?') # rubocop:disable Metrics/LineLength
  return unless add_note_to_ticket_response

  ticket_tracker.add_note(pull_request_url)
  completed_status = Toolshed::Client.instance.ticket_status_for_complete unless default_completed_status # rubocop:disable Metrics/LineLength
  ticket_tracker.update_ticket_status(completed_status)
end
default_completed_status() click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 128
def default_completed_status
  default_completed_status = nil
  begin
    default_completed_status = Object.const_get("#{ticket_tracker_class}::DEFAULT_COMPLETED_STATUS") # rubocop:disable Metrics/LineLength
  rescue
    false
  end
  default_completed_status
end
execute_pull_request(options) click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 142
def execute_pull_request(options) # rubocop:disable Metrics/AbcSize
  self.git_tool = Object.const_get("Toolshed::Git::#{Toolshed::Client.instance.git_tool.camel_case}").create_instance # rubocop:disable Metrics/LineLength

  options = get_pull_request_title(options)
  get_pull_request_body(options)
  send_pull_request
  add_note_to_ticket unless ticket_tracker_class.nil?
  pull_request_created_message
  self
rescue => e
  Toolshed.logger.fatal e.message
  Toolshed.die
end
execute_ticket_tracking(options) click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 100
def execute_ticket_tracking(options) # rubocop:disable Metrics/AbcSize
  return options if options[:skip_ticket]
  return options if Toolshed::Client.instance.ticket_tracking_tool.nil? || Toolshed::Client.instance.ticket_tracking_tool.empty? # rubocop:disable Metrics/LineLength

  begin
    self.ticket_tracker_class =  Object.const_get("Toolshed::TicketTracking::#{Toolshed::Client.instance.ticket_tracking_tool.camel_case}") # rubocop:disable Metrics/LineLength
    options = get_ticket_project_information(options)
    initialize_ticket_tracker_properties(options)
    output_ticket_information
  rescue StandardError => e
    Toolshed.logger.fatal e.inspect
    Toolshed.logger.fatal e.backtrace
    Toolshed.logger.fatal 'Ticket tracking tool is not supported at this time'
    Toolshed.die
  end

  options
end
get_pull_request_body(options) click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 164
def get_pull_request_body(options)
  self.pull_request_body = read_user_input_body(
    "Pull request body (Default: #{ticket_tracking_url}):",
    options.merge!(default: ticket_tracking_url)
  )
  options
end
get_pull_request_title(options) click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 156
def get_pull_request_title(options)
  self.pull_request_title = read_user_input_title(
    "Pull request title (Default: #{ticket_tracking_title}):",
    options.merge!(default: ticket_tracking_title)
  )
  options
end
get_ticket_id(options) click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 85
def get_ticket_id(options)
  self.ticket_id = read_user_input_ticket_tracker_ticket_id(
    "Ticket ID (Default: #{Toolshed::TicketTracking.story_id_from_branch_name(branch.name)}):", # rubocop:disable Metrics/LineLength
    default: Toolshed::TicketTracking.story_id_from_branch_name(branch.name)
  )
  options.merge!(ticket_id: ticket_id)
  options
end
get_ticket_project_information(options) click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 192
def get_ticket_project_information(options)
  options = use_ticket_tracker_project_id(options)
  options = use_ticket_tracker_project_name(options)
  options = get_ticket_id(options)
  options
end
initialize_ticket_tracker_properties(options) click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 199
def initialize_ticket_tracker_properties(options)
  self.ticket_tracker = ticket_tracker_class.create_instance(options)
  self.ticket_tracking_url = ticket_tracker.url
  self.ticket_tracking_title = ticket_tracker.default_title
end
output_begining_messages() click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 79
def output_begining_messages
  Toolshed.logger.info "Current Branch: #{branch.name}"
  Toolshed.logger.info "Branched From: #{Toolshed::Git::Branch.from}"
  Toolshed.logger.info "Using Defaults: #{(Toolshed::Client.instance.use_defaults.nil?) ? 'No' : 'Yes'}" # rubocop:disable Metrics/LineLength
end
output_ticket_information() click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 94
def output_ticket_information
  Toolshed.logger.info "Ticket Tracking URL: #{ticket_tracking_url}"
  Toolshed.logger.info "Ticket Tracking title: #{ticket_tracking_title}"
  Toolshed.logger.info "Ticket ID: #{ticket_id}"
end
pull_request_created_message() click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 138
def pull_request_created_message
  Toolshed.logger.info "Created Pull Request: #{pull_request_url}"
end
read_user_input_add_note_to_ticket(message) click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 60
def read_user_input_add_note_to_ticket(message)
  return true if Toolshed::Client.instance.use_defaults

  puts message
  value = $stdin.gets.chomp

  until %w(y n).include?(value.downcase)
    puts 'Value must be Y or N'
    puts message
    value = $stdin.gets.chomp
  end

  (value == 'y') ? true : false
end
read_user_input_ticket_tracker_ticket_id(message, options) click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 75
def read_user_input_ticket_tracker_ticket_id(message, options)
  read_user_input(message, options)
end
send_pull_request() click to toggle source
# File lib/toolshed/commands/create_pull_request.rb, line 172
def send_pull_request
  Toolshed.logger.info 'Your pull request is being created.'
  git_pull_request_result = git_tool.create_pull_request(pull_request_title, pull_request_body) # rubocop:disable Metrics/LineLength

  self.pull_request_url = git_pull_request_result['html_url']
  return if git_pull_request_result['message'].nil?

  if git_pull_request_result['message'].downcase == 'bad credentials'
    Toolshed.logger.fatal 'Bad Credentials please try again.'
    Toolshed.die
  end

  if git_pull_request_result['message'].downcase == 'not found'
    Toolshed.logger.fatal 'Pull request not found please try again.'
    Toolshed.die
  end

  self.pull_request_url = git_pull_request_result['html_url']
end