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