class ExceptionNotifier::RedmineNotifier

Public Class Methods

new(config) click to toggle source
# File lib/exception_notifier/redmine/redmine.rb, line 16
def initialize(config)
  @config = config
end

Public Instance Methods

call(exception, options={}) click to toggle source
# File lib/exception_notifier/redmine/redmine.rb, line 20
def call(exception, options={})
  unless options[:env].nil?
    compose_data(options[:env], exception, options)
    issue = compose_issue
    create_issue(issue) unless issue_exist?(issue)
  end
end

Private Instance Methods

clean_backtrace(exception) click to toggle source
# File lib/exception_notifier/redmine/redmine.rb, line 96
def clean_backtrace(exception)
  if defined?(Rails) && Rails.respond_to?(:backtrace_cleaner)
    Rails.backtrace_cleaner.send(:filter, exception.backtrace)
  else
    exception.backtrace
  end
end
compose_data(env, exception, options = {}) click to toggle source
# File lib/exception_notifier/redmine/redmine.rb, line 30
def compose_data(env, exception, options = {})
  @env        = env
  @exception  = exception
  @options    = options
  @kontroller = env['action_controller.instance'] || Redmine::MissingController.new
  @request    = ActionDispatch::Request.new(env)
  @backtrace  = exception.backtrace ? clean_backtrace(exception) : []
  @data       = (env['exception_notifier.exception_data'] || {}).merge(options[:data] || {})
end
compose_description() click to toggle source
# File lib/exception_notifier/redmine/redmine.rb, line 63
def compose_description
  template_path = "#{File.dirname(__FILE__)}/views/exception_notifier/issue.text.erb"
  template = File.open(template_path, "r").read
  ERB.new(template, nil, '-').result(binding)
end
compose_issue() click to toggle source
# File lib/exception_notifier/redmine/redmine.rb, line 40
def compose_issue
  issue = {}
  issue[:project_id] = @config[:project_id]
  issue[:tracker_id] = @config[:tracker_id]
  issue[:status_id] = @config[:status_id]
  issue[:priority_id] = @config[:priority_id]
  issue[:assigned_to_id] = @config[:assigned_to_id] unless @config[:assigned_to_id].nil?
  issue[:fixed_version_id] = @config[:fixed_version_id] unless @config[:fixed_version_id].nil?
  issue[:subject] = compose_subject
  issue[:custom_fields] = [{ :id    => @config[:x_checksum_cf_id],
                             :value => encode_subject(issue[:subject])}]
  issue[:description] = compose_description
  issue
end
compose_subject() click to toggle source
# File lib/exception_notifier/redmine/redmine.rb, line 55
def compose_subject
  subject = "#{@config[:issues_prefix]} " || "[Error] "
  subject << "#{@kontroller.controller_name}##{@kontroller.action_name}" if @kontroller
  subject << " (#{@exception.class})"
  subject << " #{@exception.message.inspect}" if @options[:verbose_subject]
  subject.length > 120 ? subject[0...120] + "..." : subject
end
create_issue(issue) click to toggle source
# File lib/exception_notifier/redmine/redmine.rb, line 75
def create_issue(issue)
  options = { :body => { :issue => issue }.to_json,
              :headers => { "Content-Type" => "application/json" } }
  ::HTTParty.send(:post, issues_url, options)
end
encode_subject(subject) click to toggle source
# File lib/exception_notifier/redmine/redmine.rb, line 92
def encode_subject(subject)
  Digest::SHA2.hexdigest(subject)
end
issue_exist?(issue) click to toggle source
# File lib/exception_notifier/redmine/redmine.rb, line 81
def issue_exist?(issue)
  x_checksum = issue[:custom_fields][0][:value]
  response = ::HTTParty.send(:get, issues_url("project_id" => @config[:project_id],
                                              "cf_#{@config[:x_checksum_cf_id]}" => x_checksum))
  if response.nil? || response["total_count"].nil?
    Rails.logger.debug "Received unexpected response: #{response.inspect}"
    raise "Unexpected Response"
  end
  response["total_count"] > 0
end
issues_url(params = {}) click to toggle source
# File lib/exception_notifier/redmine/redmine.rb, line 69
def issues_url(params = {})
  default_params = { :key => @config[:api_key] }
  encoded_params = URI.encode_www_form(default_params.merge(params))
  "#{@config[:host_url]}/#{@config[:issues_url]}?#{encoded_params}"
end