class NdrDevSupport::RakeCI::Redmine::TicketResolver

This class encapsulates Redmine ticket logic

Constants

CLOSE_REGEX
MEGA_REGEX

Public Class Methods

new(api_key, hostname) click to toggle source
# File lib/ndr_dev_support/rake_ci/redmine/ticket_resolver.rb, line 31
def initialize(api_key, hostname)
  @headers = {
    'X-Redmine-API-Key' => api_key,
    'Content-Type'      => 'application/json'
  }
  @hostname = hostname
end

Public Instance Methods

each_ticket_from(message) { |ticket, resolved| ... } click to toggle source
# File lib/ndr_dev_support/rake_ci/redmine/ticket_resolver.rb, line 51
def each_ticket_from(message, &block)
  return enum_for(:each_ticket_from, message) unless block

  key_words     = message.scan(MEGA_REGEX).flatten.compact
  action_groups = key_words.slice_when { |_l, r| r.to_i.to_s != r }.to_a

  action_groups.each do |group|
    resolved = group.any? { |word| word =~ CLOSE_REGEX }
    tickets  = group.select { |word| word.to_i.to_s == word }.uniq

    tickets.each { |ticket| yield(ticket, resolved) }
  end
end
process_commit(user, revision, message, tests_passed) click to toggle source
# File lib/ndr_dev_support/rake_ci/redmine/ticket_resolver.rb, line 39
def process_commit(user, revision, message, tests_passed)
  resolved_tickets = []

  each_ticket_from(message) do |ticket, resolved|
    update_ticket(message, user, revision, ticket, resolved, tests_passed)

    resolved_tickets << ticket if resolved && tests_passed
  end

  resolved_tickets
end
update_payload(message, user, revision, ticket_closed, resolved, tests_passed) click to toggle source
# File lib/ndr_dev_support/rake_ci/redmine/ticket_resolver.rb, line 65
def update_payload(message, user, revision, ticket_closed, resolved, tests_passed)
  if resolved && !ticket_closed && !tests_passed
    message += "\n\n*Automated tests did not pass successfully, so ticket status left unchanged.*"
  end

  payload = {
    notes: "_#{resolved ? 'Resolved' : 'Referenced'} by #{user} in #{revision}_:" \
           "#{resolved ? message.gsub(CLOSE_REGEX, '+\1+') : message}"
  }

  payload[:status_id] = 3 if resolved && !ticket_closed && tests_passed
  payload
end

Private Instance Methods

http() click to toggle source

Connect lazily

# File lib/ndr_dev_support/rake_ci/redmine/ticket_resolver.rb, line 82
def http
  return @http if @http
  @http = Net::HTTP.new(@hostname, 443)
  @http.use_ssl = true
  @http
end
ticket_closed?(ticket) click to toggle source
# File lib/ndr_dev_support/rake_ci/redmine/ticket_resolver.rb, line 98
def ticket_closed?(ticket)
  response = http.send_request('GET', "/issues/#{ticket.to_i}.json", nil, @headers)
  JSON.parse(response.body)['issue']['status']['id'] == 5
end
update_ticket(message, user, revision, ticket, resolved, tests_passed) click to toggle source
# File lib/ndr_dev_support/rake_ci/redmine/ticket_resolver.rb, line 89
def update_ticket(message, user, revision, ticket, resolved, tests_passed)
  payload = update_payload(message, user, revision, ticket_closed?(ticket), resolved, tests_passed)

  http.send_request('PUT',
                    "/issues/#{ticket.to_i}.json",
                    JSON.dump(issue: payload),
                    @headers)
end