# frozen_string_literal: true
require 'uri'
require 'net/http'
require_relative 'network'
module Danger
# Lgtm let danger say lgtm when there is no violations.
# Default use random lgtm image from [lgtm.in](https://lgtm.in).
#
# @example Post lgtm with a specific image
#
# lgtm.check_lgtm image_url: 'http://some.iamge'
#
# @see leonhartX/danger-lgtm
# @tags lgtm, github
#
class DangerLgtm < Plugin
include ::Lgtm::Network
LGTM_URL = 'https://www.lgtm.app'.freeze
RANDOM_POST_PATH = '/g'.freeze
POST_CONTENT_PATH = '/p'.freeze
# check_lgtm Comment LGTM markdown if report has no violations
#
# @param [String] image_url LGTM image url
# @param [Boolean] https_image_only Use only secure url
#
# @return [nil]
#
def check_lgtm(image_url: nil, https_image_only: false)
return if status_report[:errors].any?
return if status_report[:warnings].any?
if image_url
comment image_url
else
comment fetch_image_url(https_image_only)
end
end
private
# comment Place markdown comment
#
# @param [Boolean] url LGTM image url
#
# @return [nil]
#
def comment(url)
if url.nil?
markdown("
LGTM
")
else
markdown("")
end
end
# fetch_image_url Fetch LGTM image url from https://www.lgtm.app
#
# @param [Boolean] reject_insecure_url Eeturn only secure url
#
# @return [String] LGTM image url
#
def fetch_image_url(reject_insecure_url = false)
post_id = fetch_randon_post_id
return if post_id.empty?
post_content_url = fetch_post_content_url(post_id)
return if post_content_url.empty?
return fetch_image_url(reject_insecure_url) if retry?(reject_insecure_url,
post_content_url)
post_content_url
rescue ::Lgtm::Network::NetworkError => e
$stdout.puts e.message
end
# fetch_randon_post_id Fetch renadon LGTM post url from https://www.lgtm.app
#
# @return [String] LGTM post url
#
def fetch_randon_post_id
uri = URI.join(LGTM_URL, RANDOM_POST_PATH)
response = process_request(uri)
location = parse_redirect_location(response)
location.split('/').last
end
# fetch_post_content_url Fetch LGTM image url from https://www.lgtm.app
#
# @param [String] post_id LGTM post identifier
#
# @return [String] LGTM image url
#
def fetch_post_content_url(post_id)
uri = URI.join(LGTM_URL, POST_CONTENT_PATH, post_id)
response = process_request(uri)
parse_redirect_location(response)
end
# retry? Check should be image url requested again
#
# @param [Boolean] reject_insecure_url Return only secure url
# @param [String] url LGTM image url
#
# @return [Boolean] should be image url requested again
#
def retry?(reject_insecure_url, url)
reject_insecure_url && https?(URI.parse(url))
end
end
end