rainforestapp/fourchette

View on GitHub
lib/fourchette/github.rb

Summary

Maintainability
A
0 mins
Test Coverage
class Fourchette::GitHub
  include Fourchette::Logger

  def enable_hook
    logger.info 'Enabling the hooks for your app...'
    if fourchette_hook
      enable(fourchette_hook)
    else
      create_hook
    end
  end

  def disable_hook
    logger.info 'Disabling the hook for your app...'
    if fourchette_hook && fourchette_hook.active == true
      disable(fourchette_hook)
    else
      logger.error 'Nothing to disable, move along!'
    end
  end

  def update_hook
    logger.info 'Updating the hook for your app...'
    toggle_active_state_to fourchette_hook, fourchette_hook.active
  end

  def delete_hook
    logger.info 'Removing the hook for your app...'
    octokit.remove_hook(ENV['FOURCHETTE_GITHUB_PROJECT'], fourchette_hook.id)
  end

  def comment_pr(pr_number, comment)
    if Fourchette::DEBUG
      comment = <<-TXT
        ****** FOURCHETTE COMMENT ******\n
        \n#{comment}\n\n
        ****** END OF FOURCHETTE COMMENT ******
      TXT
    end

    octokit.add_comment(ENV['FOURCHETTE_GITHUB_PROJECT'], pr_number, comment)
  end

  private

  def octokit
    @octokit_client ||= Octokit::Client.new(
      login: ENV['FOURCHETTE_GITHUB_USERNAME'],
      password: ENV['FOURCHETTE_GITHUB_PERSONAL_TOKEN']
    )
  end

  def create_hook
    logger.info 'Creating a new hook...'
    octokit.create_hook(
      ENV['FOURCHETTE_GITHUB_PROJECT'],
      'web',
      hook_options,
      events: ['pull_request'],
      active: true
    )
  end

  def hook_options
    {
      url: "#{ENV['FOURCHETTE_APP_URL']}/hooks",
      content_type: 'json',
      fourchette_env: FOURCHETTE_CONFIG[:env_name]
    }
  end

  def hooks
    octokit.hooks(ENV['FOURCHETTE_GITHUB_PROJECT'])
  end

  def fourchette_hook
    existing_hook = nil

    hooks.each do |hook|
      existing_hook = hook unless hook.config && hook.config.fourchette_env.nil?
    end

    existing_hook
  end

  def enable(hook)
    if hook.active
      logger.error 'The hook is already active!'
    else
      toggle_active_state_to hook, true
    end
  end

  def disable(hook)
    toggle_active_state_to hook, false
  end

  def toggle_active_state_to(hook, active_value)
    octokit.edit_hook(
      ENV['FOURCHETTE_GITHUB_PROJECT'],
      hook.id,
      'web',
      hook_options,
      events: ['pull_request'],
      active: active_value
    )
  end
end