Class: Pra::GithubPullSource

Inherits:
PullSource show all
Defined in:
lib/pra/github_pull_source.rb

Instance Method Summary collapse

Constructor Details

#initialize(config = {}) ⇒ GithubPullSource

Returns a new instance of GithubPullSource.



9
10
11
12
13
14
# File 'lib/pra/github_pull_source.rb', line 9

def initialize(config = {})
  @ratelimit_remaining = 5000
  @ratelimit_limit = 5000
  @ratelimit_reset = nil
  super(config)
end

Instance Method Details

#collect_exclusionsObject



90
91
92
93
94
95
96
# File 'lib/pra/github_pull_source.rb', line 90

def collect_exclusions
  @exclusions = {}
  organizations.each do |org|
    @exclusions[org['name'].downcase] = org['exclude']
  end
  @exclusions
end

#excluded?(org, repository) ⇒ Boolean

Returns:

  • (Boolean)


98
99
100
# File 'lib/pra/github_pull_source.rb', line 98

def excluded?(org, repository)
  excluded_repos[org.downcase] && excluded_repos[org.downcase].include?(repository)
end

#excluded_reposObject



86
87
88
# File 'lib/pra/github_pull_source.rb', line 86

def excluded_repos
  @excluded_repos || collect_exclusions
end

#extract_repository_from_html_url(html_url) ⇒ Object



102
103
104
105
# File 'lib/pra/github_pull_source.rb', line 102

def extract_repository_from_html_url(html_url)
  /https:\/\/github.com\/(\w+)\/([\w-]+)/.match(html_url)
  return $1, $2
end

#fetch_pull_requestsObject



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/pra/github_pull_source.rb', line 20

def fetch_pull_requests
  pull_requests_json = "[]"
  conn = Faraday.new
  conn.basic_auth(@config['username'], @config['password'])
  resp = conn.get do |req|
    req.url rest_api_search_issues_url
    req.params['q'] = "is:pr is:open sort:updated-desc #{repos_for_query}"
    req.params['per_page'] = '300'
    req.headers['Content-Type'] = 'application/json'
    req.headers['Accept'] = 'application/json'
  end

  @ratelimit_reset = Time.at(resp.headers['x-ratelimit-reset'].to_i)
  @ratelimit_limit = resp.headers['x-ratelimit-limit'].to_i
  @ratelimit_remaining = resp.headers['x-ratelimit-remaining'].to_i
  Pra::Log.debug("Fetched pull requests and updated ratelimit tracking")
  Pra::Log.debug("Ratelimit Reset: #{@ratelimit_reset}")
  Pra::Log.debug("Ratelimit Limit: #{@ratelimit_limit}")
  Pra::Log.debug("Ratelimit Remaining: #{@ratelimit_remaining}")
  pull_requests_json = resp.body
  Pra::Log.debug(pull_requests_json)
  JSON.parse(pull_requests_json)
end

#get_all_pull_requestsObject



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/pra/github_pull_source.rb', line 44

def get_all_pull_requests
  pull_requests = []

  pull_requests_hash = fetch_pull_requests
  pull_requests_hash['items'].each do |request|
    begin
      org, repository = extract_repository_from_html_url(request['html_url'])
      unless excluded?(org, repository)
        pull_requests << Pra::PullRequest.new(title: request["title"],
                                              from_reference: "",
                                              to_reference: "",
                                              author: request["user"]["login"],
                                              assignee: request["assignee"] ? request["assignee"]["login"] : nil,
                                              link: request['html_url'],
                                              service_id: 'github',
                                              repository: repository,
                                              updated_at: request["updated_at"],
                                              labels: request["labels"].collect{|l| l["name"]}.join(","))
      end
    rescue StandardError => e
      Pra::Log.error("Error: #{e.to_s}")
      Pra::Log.error("Request: #{request.inspect}")
    end
  end
  pull_requests
end

#organizationsObject



115
116
117
# File 'lib/pra/github_pull_source.rb', line 115

def organizations
  @config["organizations"] || []
end

#pull_requestsObject



16
17
18
# File 'lib/pra/github_pull_source.rb', line 16

def pull_requests
  return get_all_pull_requests
end

#repos_for_queryObject



71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/pra/github_pull_source.rb', line 71

def repos_for_query
  query_params = []
  repositories.each do |repo|
    query_params << "repo:#{repo['owner']}/#{repo['repository']}"
  end

  @excluded_repos = {}
  organizations.each do |org|
    query_params << "org:#{org['name']}"
    @excluded_repos[org['name'].downcase] = org['exclude']
  end

  return query_params.join(" ")
end

#repositoriesObject



111
112
113
# File 'lib/pra/github_pull_source.rb', line 111

def repositories
  @config["repositories"] || []
end

#rest_api_search_issues_urlObject



107
108
109
# File 'lib/pra/github_pull_source.rb', line 107

def rest_api_search_issues_url
  "#{@config['protocol']}://#{@config['host']}/search/issues"
end