Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2019-10-16 12:07:51 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2019-10-16 12:07:51 +0300
commit914ea32e0efca21436220df2c10e1bfbe4ed3da9 (patch)
treee8eb3b97aea2006bd863c586b7ec41d51f654b3b /lib/gitlab/danger
parent3546e1bb0971347e9e9984de0799e3fb53743b33 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/danger')
-rw-r--r--lib/gitlab/danger/request_helper.rb23
-rw-r--r--lib/gitlab/danger/roulette.rb33
-rw-r--r--lib/gitlab/danger/teammate.rb14
3 files changed, 44 insertions, 26 deletions
diff --git a/lib/gitlab/danger/request_helper.rb b/lib/gitlab/danger/request_helper.rb
new file mode 100644
index 00000000000..06da4ed9ad3
--- /dev/null
+++ b/lib/gitlab/danger/request_helper.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'net/http'
+require 'json'
+
+module Gitlab
+ module Danger
+ module RequestHelper
+ HTTPError = Class.new(RuntimeError)
+
+ # @param [String] url
+ def self.http_get_json(url)
+ rsp = Net::HTTP.get_response(URI.parse(url))
+
+ unless rsp.is_a?(Net::HTTPOK)
+ raise HTTPError, "Failed to read #{url}: #{rsp.code} #{rsp.message}"
+ end
+
+ JSON.parse(rsp.body)
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/danger/roulette.rb b/lib/gitlab/danger/roulette.rb
index 25de0a87c9d..0700a72c918 100644
--- a/lib/gitlab/danger/roulette.rb
+++ b/lib/gitlab/danger/roulette.rb
@@ -1,16 +1,11 @@
# frozen_string_literal: true
-require 'net/http'
-require 'json'
-require 'cgi'
-
require_relative 'teammate'
module Gitlab
module Danger
module Roulette
ROULETTE_DATA_URL = 'https://about.gitlab.com/roulette.json'
- HTTPError = Class.new(RuntimeError)
# Looks up the current list of GitLab team members and parses it into a
# useful form
@@ -19,7 +14,7 @@ module Gitlab
def team
@team ||=
begin
- data = http_get_json(ROULETTE_DATA_URL)
+ data = Gitlab::Danger::RequestHelper.http_get_json(ROULETTE_DATA_URL)
data.map { |hash| ::Gitlab::Danger::Teammate.new(hash) }
rescue JSON::ParserError
raise "Failed to parse JSON response from #{ROULETTE_DATA_URL}"
@@ -44,6 +39,7 @@ module Gitlab
# Known issue: If someone is rejected due to OOO, and then becomes not OOO, the
# selection will change on next spin
+ # @param [Array<Teammate>] people
def spin_for_person(people, random:)
people.shuffle(random: random)
.find(&method(:valid_person?))
@@ -51,32 +47,17 @@ module Gitlab
private
+ # @param [Teammate] person
+ # @return [Boolean]
def valid_person?(person)
- !mr_author?(person) && !out_of_office?(person)
+ !mr_author?(person) && !person.out_of_office?
end
+ # @param [Teammate] person
+ # @return [Boolean]
def mr_author?(person)
person.username == gitlab.mr_author
end
-
- def out_of_office?(person)
- username = CGI.escape(person.username)
- api_endpoint = "https://gitlab.com/api/v4/users/#{username}/status"
- response = http_get_json(api_endpoint)
- response["message"]&.match?(/OOO/i)
- rescue HTTPError, JSON::ParserError
- false # this is no worse than not checking for OOO
- end
-
- def http_get_json(url)
- rsp = Net::HTTP.get_response(URI.parse(url))
-
- unless rsp.is_a?(Net::HTTPSuccess)
- raise HTTPError, "Failed to read #{url}: #{rsp.code} #{rsp.message}"
- end
-
- JSON.parse(rsp.body)
- end
end
end
end
diff --git a/lib/gitlab/danger/teammate.rb b/lib/gitlab/danger/teammate.rb
index 4ad66f61c2b..c0a2d909f69 100644
--- a/lib/gitlab/danger/teammate.rb
+++ b/lib/gitlab/danger/teammate.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+require 'cgi'
+
module Gitlab
module Danger
class Teammate
@@ -34,6 +36,18 @@ module Gitlab
has_capability?(project, category, :maintainer, labels)
end
+ 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
+
private
def has_capability?(project, category, kind, labels)