Module: Legion::Extensions::Github::Runners::PullRequests
Constant Summary
Helpers::Cache::DEFAULT_TTL, Helpers::Cache::DEFAULT_TTLS
Helpers::Client::CREDENTIAL_RESOLVERS
Helpers::TokenCache::TOKEN_BUFFER_SECONDS
Instance Method Summary
collapse
-
#create_pull_request(owner:, repo:, title:, head:, base:, body: nil, draft: false) ⇒ Object
-
#create_review(owner:, repo:, pull_number:, body:, comments: [], event: 'COMMENT') ⇒ Object
-
#get_pull_request(owner:, repo:, pull_number:) ⇒ Object
-
#list_all_pull_request_files(owner:, repo:, pull_number:) ⇒ Object
-
#list_pull_request_commits(owner:, repo:, pull_number:, per_page: 100) ⇒ Object
-
#list_pull_request_files(owner:, repo:, pull_number:, per_page: 30, page: 1) ⇒ Object
-
#list_pull_request_review_comments(owner:, repo:, pull_number:, per_page: 30, page: 1) ⇒ Object
-
#list_pull_request_reviews(owner:, repo:, pull_number:, per_page: 30, page: 1) ⇒ Object
-
#list_pull_requests(owner:, repo:, state: 'open', per_page: 30, page: 1) ⇒ Object
-
#mark_pr_ready(owner:, repo:, pull_number:) ⇒ Object
-
#merge_pull_request(owner:, repo:, pull_number:, commit_title: nil, merge_method: 'merge') ⇒ Object
-
#update_pull_request(owner:, repo:, pull_number:, **opts) ⇒ Object
#cache_connected?, #cache_invalidate, #cache_write, #cached_get, #github_ttl_for, #local_cache_connected?, #local_cache_delete, #local_cache_get, #local_cache_set
#connection, #gh_cli_token_output, #max_fallback_retries, #on_rate_limit, #on_scope_authorized, #on_scope_denied, #resolve_broker_app, #resolve_credential, #resolve_env, #resolve_gh_cli, #resolve_next_credential, #resolve_settings_app, #resolve_settings_delegated, #resolve_settings_pat, #resolve_vault_app, #resolve_vault_delegated, #resolve_vault_pat
#credential_fingerprint, #invalidate_scope, #mark_rate_limited, #rate_limited?, #register_scope, #scope_status
#fetch_token, #mark_rate_limited, #rate_limited?, #store_token
Instance Method Details
#create_pull_request(owner:, repo:, title:, head:, base:, body: nil, draft: false) ⇒ Object
27
28
29
30
31
32
|
# File 'lib/legion/extensions/github/runners/pull_requests.rb', line 27
def create_pull_request(owner:, repo:, title:, head:, base:, body: nil, draft: false, **)
payload = { title: title, head: head, base: base, body: body, draft: draft }
response = connection(owner: owner, repo: repo, **).post("/repos/#{owner}/#{repo}/pulls", payload)
cache_write("github:repo:#{owner}/#{repo}:pulls:#{response.body['number']}", response.body) if response.body['id']
{ result: response.body }
end
|
#create_review(owner:, repo:, pull_number:, body:, comments: [], event: 'COMMENT') ⇒ Object
94
95
96
97
98
|
# File 'lib/legion/extensions/github/runners/pull_requests.rb', line 94
def create_review(owner:, repo:, pull_number:, body:, comments: [], event: 'COMMENT', **)
payload = { event: event, body: body, comments: }
response = connection(owner: owner, repo: repo, **).post("/repos/#{owner}/#{repo}/pulls/#{pull_number}/reviews", payload)
{ result: response.body }
end
|
#get_pull_request(owner:, repo:, pull_number:) ⇒ Object
21
22
23
24
25
|
# File 'lib/legion/extensions/github/runners/pull_requests.rb', line 21
def get_pull_request(owner:, repo:, pull_number:, **)
{ result: cached_get("github:repo:#{owner}/#{repo}:pulls:#{pull_number}") do
connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/pulls/#{pull_number}").body
end }
end
|
#list_all_pull_request_files(owner:, repo:, pull_number:) ⇒ Object
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
# File 'lib/legion/extensions/github/runners/pull_requests.rb', line 54
def list_all_pull_request_files(owner:, repo:, pull_number:, **)
all_files = []
page = 1
per_page = 100
loop do
batch = connection(owner: owner, repo: repo, **).get(
"/repos/#{owner}/#{repo}/pulls/#{pull_number}/files",
{ per_page: per_page, page: page }
).body
all_files.concat(batch)
break if batch.size < per_page
page += 1
end
{ result: all_files }
end
|
#list_pull_request_commits(owner:, repo:, pull_number:, per_page: 100) ⇒ Object
48
49
50
51
52
|
# File 'lib/legion/extensions/github/runners/pull_requests.rb', line 48
def list_pull_request_commits(owner:, repo:, pull_number:, per_page: 100, **)
{ result: connection(owner: owner, repo: repo, **).get(
"/repos/#{owner}/#{repo}/pulls/#{pull_number}/commits", { per_page: per_page }
).body }
end
|
#list_pull_request_files(owner:, repo:, pull_number:, per_page: 30, page: 1) ⇒ Object
80
81
82
83
84
85
|
# File 'lib/legion/extensions/github/runners/pull_requests.rb', line 80
def list_pull_request_files(owner:, repo:, pull_number:, per_page: 30, page: 1, **)
params = { per_page: per_page, page: page }
{ result: cached_get("github:repo:#{owner}/#{repo}:pulls:#{pull_number}:files:#{page}:#{per_page}") do
connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/pulls/#{pull_number}/files", params).body
end }
end
|
73
74
75
76
77
78
|
# File 'lib/legion/extensions/github/runners/pull_requests.rb', line 73
def (owner:, repo:, pull_number:, per_page: 30, page: 1, **)
params = { per_page: per_page, page: page }
{ result: connection(owner: owner, repo: repo, **).get(
"/repos/#{owner}/#{repo}/pulls/#{pull_number}/comments", params
).body }
end
|
#list_pull_request_reviews(owner:, repo:, pull_number:, per_page: 30, page: 1) ⇒ Object
87
88
89
90
91
92
|
# File 'lib/legion/extensions/github/runners/pull_requests.rb', line 87
def list_pull_request_reviews(owner:, repo:, pull_number:, per_page: 30, page: 1, **)
params = { per_page: per_page, page: page }
{ result: cached_get("github:repo:#{owner}/#{repo}:pulls:#{pull_number}:reviews:#{page}:#{per_page}") do
connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/pulls/#{pull_number}/reviews", params).body
end }
end
|
#list_pull_requests(owner:, repo:, state: 'open', per_page: 30, page: 1) ⇒ Object
14
15
16
17
18
19
|
# File 'lib/legion/extensions/github/runners/pull_requests.rb', line 14
def list_pull_requests(owner:, repo:, state: 'open', per_page: 30, page: 1, **)
params = { state: state, per_page: per_page, page: page }
{ result: cached_get("github:repo:#{owner}/#{repo}:pulls:#{state}:#{page}:#{per_page}") do
connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/pulls", params).body
end }
end
|
#mark_pr_ready(owner:, repo:, pull_number:) ⇒ Object
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
# File 'lib/legion/extensions/github/runners/pull_requests.rb', line 100
def mark_pr_ready(owner:, repo:, pull_number:, **)
pr_data = get_pull_request(owner: owner, repo: repo, pull_number: pull_number)
node_id = pr_data.dig(:result, 'node_id') || pr_data.dig(:result, :node_id)
return { success: false, reason: :no_node_id } unless node_id
query = <<~GRAPHQL
mutation {
markPullRequestAsReady(input: { pullRequestId: "#{node_id}" }) {
pullRequest { id isDraft }
}
}
GRAPHQL
conn = graphql_connection(owner: owner, repo: repo)
response = conn.post('/graphql', { query: query })
errors = response.body['errors']
return { success: false, reason: :graphql_error, errors: errors } if errors&.any?
{ success: true, result: response.body.dig('data', 'markPullRequestAsReady', 'pullRequest') }
end
|
#merge_pull_request(owner:, repo:, pull_number:, commit_title: nil, merge_method: 'merge') ⇒ Object
41
42
43
44
45
46
|
# File 'lib/legion/extensions/github/runners/pull_requests.rb', line 41
def merge_pull_request(owner:, repo:, pull_number:, commit_title: nil, merge_method: 'merge', **)
payload = { commit_title: commit_title, merge_method: merge_method }.compact
response = connection(owner: owner, repo: repo, **).put("/repos/#{owner}/#{repo}/pulls/#{pull_number}/merge", payload)
cache_invalidate("github:repo:#{owner}/#{repo}:pulls:#{pull_number}")
{ result: response.body }
end
|
#update_pull_request(owner:, repo:, pull_number:, **opts) ⇒ Object
34
35
36
37
38
39
|
# File 'lib/legion/extensions/github/runners/pull_requests.rb', line 34
def update_pull_request(owner:, repo:, pull_number:, **opts)
payload = opts.slice(:title, :body, :state, :base)
response = connection(owner: owner, repo: repo, **opts).patch("/repos/#{owner}/#{repo}/pulls/#{pull_number}", payload)
cache_write("github:repo:#{owner}/#{repo}:pulls:#{pull_number}", response.body) if response.body['id']
{ result: response.body }
end
|