class JiraClient

Constants

BUG_TYPE
ISSUES_CACHE_KEY
STORY_TYPE

Public Class Methods

new(config) click to toggle source
# File lib/integrations/jira_client.rb, line 14
def initialize(config)
  @client_config = config["client_config"]
  @issue_id_rgx = issue_id_rgx
  @cached_issues = load_cached_issues()
  @business_value_custom_field = "customfield_#{config["business_value_field_id"]}"
end

Public Instance Methods

merge_and_fetch_bugs!(commits) click to toggle source
# File lib/integrations/jira_client.rb, line 32
def merge_and_fetch_bugs!(commits)
  commits
    .reduce([]) do |acc, commit|
      issue_id = parse_id(commit.subject).to_sym
      issue = issue_id.present? ? find_by_id(issue_id) : nil
      if issue.present? && issue[:issue_type] == "Bug"
        bug = {}.merge(issue)
        bug[:bug_id] = bug.delete(:issue_id)
        commit.bug_id = bug[:bug_id]
        acc << bug
      end
      acc
    end
    .map { |bug| Store::Bug::index(bug) }
end
merge_and_fetch_issues!(commits) click to toggle source

TODO: Store Issues as they're fetched.

# File lib/integrations/jira_client.rb, line 22
def merge_and_fetch_issues!(commits)
  issue_ids = fetch_issues(merge_issue_ids!(commits))
    .reject { |issue_id, issue| issue.empty? }
    .map { |issue_id, issue| Store::Issue::index(issue) }

  Store::Issue::cache(@cached_issues)

  issue_ids
end

Private Instance Methods

client(jira_config) click to toggle source
# File lib/integrations/jira_client.rb, line 50
def client(jira_config)
  jira_config["auth_type"] = jira_config["auth_type"].to_sym
  jira_config = Hash[jira_config.map{ |key, value| [key.to_sym, value] }]
  JIRA::Client.new(jira_config)
end
extract_person(data) click to toggle source
# File lib/integrations/jira_client.rb, line 120
def extract_person(data)
  return {} if data.nil?
  {
    email: data["emailAddress"],
    name: data["displayName"]
  }
end
fetch_issue(issue_id) click to toggle source
# File lib/integrations/jira_client.rb, line 116
def fetch_issue(issue_id)
  request("/issue/#{issue_id}")
end
fetch_issues(ids) click to toggle source
# File lib/integrations/jira_client.rb, line 84
def fetch_issues(ids)
  ids.reduce({}) do |obj, id|
    obj[id] = find_by_id(id)
    obj
  end
end
fetch_projects() click to toggle source
# File lib/integrations/jira_client.rb, line 128
def fetch_projects()
  request("/project")
end
find_by_id(id) click to toggle source

TODO: support many fix versions…

# File lib/integrations/jira_client.rb, line 57
def find_by_id(id)
  return @cached_issues[id] if @cached_issues.has_key?(id)

  Loggr.instance.info("FETCHING ISSUE: #{id}")
  issue = fetch_issue(id)
  {
    issue_id: id,
    status: issue.dig("fields", "status", "name"),
    assignee: extract_person(issue.dig("fields", "assignee")),
    reporter: extract_person(issue.dig("fields", "reporter")),
    issue_type: issue.dig("fields", "issuetype", "name"),
    business_value: issue.dig("fields", @business_value_custom_field) || 0.0,
    priority: issue.dig("fields", "priority", "name"),
    fix_versions: issue.dig("fields", "fixVersions").map { |fix| fix["name"] }.first,
    link: "#{@client_config["site"]}/browse/#{id}",
    summary: issue.dig("fields", "summary")
  }
rescue
  {}
end
issue_id_rgx() click to toggle source

TODO: Cache projects

# File lib/integrations/jira_client.rb, line 112
def issue_id_rgx()
  Regexp.new("(#{project_keys.join("|")})-\\d+", Regexp::IGNORECASE)
end
load_cached_issues() click to toggle source
# File lib/integrations/jira_client.rb, line 101
def load_cached_issues()
  Cache.read(ISSUES_CACHE_KEY, {})
    .reduce({}) do |acc, (issue_id, issue)|
      issue = issue.symbolize_keys
      issue[:issue_id] = issue_id.to_sym
      acc[issue_id.to_sym] = issue
      acc
    end
end
merge_issue_ids!(commits) click to toggle source
# File lib/integrations/jira_client.rb, line 91
def merge_issue_ids!(commits)
  commits
    .map do |commit|
      commit.issue_id = parse_id(commit.subject).to_sym
      commit.issue_id
    end
    .reject { |id| id.empty? }
    .uniq
end
parse_id(commit_subject) click to toggle source
# File lib/integrations/jira_client.rb, line 78
def parse_id(commit_subject)
  @issue_id_rgx
    .match(commit_subject)
    .try(:[], 0) || ""
end
project_keys() click to toggle source
# File lib/integrations/jira_client.rb, line 141
def project_keys()
  fetch_projects()
    .map { |project| project["key"] }
end
request(uri) click to toggle source
# File lib/integrations/jira_client.rb, line 132
def request(uri)
  uri = URI("#{@client_config["site"]}/rest/api/2#{uri}")
  req = Net::HTTP::Get.new(uri)
  req.basic_auth(@client_config["username"], @client_config["password"])
  http = Net::HTTP.new(uri.hostname, uri.port)
  http.use_ssl = true
  JSON.parse(http.request(req).body)
end