2019-02-05 17:16:18 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2019-10-16 09:07:51 +00:00
|
|
|
require 'cgi'
|
|
|
|
|
2019-02-05 17:16:18 +00:00
|
|
|
module Gitlab
|
|
|
|
module Danger
|
|
|
|
class Teammate
|
2019-05-23 18:07:59 +00:00
|
|
|
attr_reader :name, :username, :role, :projects
|
2019-02-05 17:16:18 +00:00
|
|
|
|
|
|
|
def initialize(options = {})
|
|
|
|
@username = options['username']
|
2019-05-29 15:15:09 +00:00
|
|
|
@name = options['name'] || @username
|
2019-05-23 18:07:59 +00:00
|
|
|
@role = options['role']
|
2019-02-05 17:16:18 +00:00
|
|
|
@projects = options['projects']
|
|
|
|
end
|
|
|
|
|
|
|
|
def markdown_name
|
|
|
|
"[#{name}](https://gitlab.com/#{username}) (`@#{username}`)"
|
|
|
|
end
|
|
|
|
|
|
|
|
def in_project?(name)
|
|
|
|
projects&.has_key?(name)
|
|
|
|
end
|
|
|
|
|
|
|
|
# Traintainers also count as reviewers
|
2019-05-23 18:07:59 +00:00
|
|
|
def reviewer?(project, category, labels)
|
|
|
|
has_capability?(project, category, :reviewer, labels) ||
|
|
|
|
traintainer?(project, category, labels)
|
2019-02-05 17:16:18 +00:00
|
|
|
end
|
|
|
|
|
2019-05-23 18:07:59 +00:00
|
|
|
def traintainer?(project, category, labels)
|
|
|
|
has_capability?(project, category, :trainee_maintainer, labels)
|
2019-02-05 17:16:18 +00:00
|
|
|
end
|
|
|
|
|
2019-05-23 18:07:59 +00:00
|
|
|
def maintainer?(project, category, labels)
|
|
|
|
has_capability?(project, category, :maintainer, labels)
|
2019-02-05 17:16:18 +00:00
|
|
|
end
|
|
|
|
|
2019-10-16 09:07:51 +00:00
|
|
|
def status
|
|
|
|
api_endpoint = "https://gitlab.com/api/v4/users/#{CGI.escape(username)}/status"
|
|
|
|
@status ||= Gitlab::Danger::RequestHelper.http_get_json(api_endpoint)
|
|
|
|
rescue Gitlab::Danger::RequestHelper::HTTPError, JSON::ParserError
|
|
|
|
nil # better no status than a crashing Danger
|
|
|
|
end
|
|
|
|
|
|
|
|
# @return [Boolean]
|
|
|
|
def out_of_office?
|
|
|
|
status&.dig("message")&.match?(/OOO/i) || false
|
|
|
|
end
|
|
|
|
|
2019-02-05 17:16:18 +00:00
|
|
|
private
|
|
|
|
|
2019-05-23 18:07:59 +00:00
|
|
|
def has_capability?(project, category, kind, labels)
|
|
|
|
case category
|
|
|
|
when :test
|
2019-08-27 17:13:55 +00:00
|
|
|
area = role[/Test Automation Engineer(?:.*?, (\w+))/, 1]
|
2019-05-23 18:07:59 +00:00
|
|
|
|
2019-08-27 17:13:55 +00:00
|
|
|
area && labels.any?("devops::#{area.downcase}") if kind == :reviewer
|
2019-09-03 22:02:55 +00:00
|
|
|
when :engineering_productivity
|
|
|
|
role[/Engineering Productivity/] if kind == :reviewer
|
2019-05-23 18:07:59 +00:00
|
|
|
else
|
|
|
|
capabilities(project).include?("#{kind} #{category}")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-02-05 17:16:18 +00:00
|
|
|
def capabilities(project)
|
2019-03-06 16:00:27 +00:00
|
|
|
Array(projects.fetch(project, []))
|
2019-02-05 17:16:18 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|